Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: redukce "duplicitních" hodnot v listu

Aktivity
Avatar
Adam Ježek
Tvůrce
Avatar
Adam Ježek:25.9.2014 19:26

Zdravim,
mam menší problém. V pythonu mam list, ve kterém mám duplicitní hodnoty. Né tedy úplně duplicitní, spíš složena stejnými číslicemi.
Tedy, jako duplicitní jsou: 1123, 1213, 2113, ale 1222 k nim nepatří. Aby bylo jasno, jde mi o to, aby tam nebyly hodnoty složené ze stejného počtu stejných číslic (ten list má v sobě stringy, ale můžu tam nastrkat i int). Potřeboval bych na to nějaký algoritmus, protože v tom listu je kolem 30 000 desetimístných hodnot. Nemáte někdo nápad jak to udělat?

Odpovědět
25.9.2014 19:26
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
coells
Tvůrce
Avatar
Odpovídá na Adam Ježek
coells:25.9.2014 19:40

Možná kdybys také napsal, co se vlastně má udělat?

Chceš z listu vyházet duplicity?
Chceš rychlou kontrolu, jestli seznam už obsahuje jeden nějaký prvek?
Jaká hodnota se bere jako klíčová, pokud máš duplicitu?

 
Nahoru Odpovědět
25.9.2014 19:40
Avatar
Adam Ježek
Tvůrce
Avatar
Odpovídá na coells
Adam Ježek:25.9.2014 19:44

chci ty duplicity vyházet. součet všech čísel v listu je vždycky stejný, ale došlo mi, že při násobení nezáleží na pořadí, takže zkoušim mezi sebou ty hodnoty pronásobit a funguje to, jen to není zrovna pěkné.

vystup2 = []
for a in vystup:
    obsahuje = False
    nasobek = int(a[0]) * int(a[1]) * int(a[2]) * int(a[3]) * int(a[4]) * int(a[5]) * int(a[6]) * int(a[7]) * int(a[8]) * int(a[9])
    for b in vystup2:
        nasobek2 = int(b[0]) * int(b[1]) * int(b[2]) * int(b[3]) * int(b[4]) * int(b[5]) * int(b[6]) * int(b[7]) * int(b[8]) * int(b[9])
        if(nasobek == nasobek2):
            obsahuje = True
            break
    if (obsahuje == False):
        vystup2.append(a)

S tím že vystup je list se všemi hodnotami

Nahoru Odpovědět
25.9.2014 19:44
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
coells
Tvůrce
Avatar
Odpovídá na Adam Ježek
coells:25.9.2014 19:58

Kromě toho, že nuly a jedničky budou trochu problém...

src = ['1123', '1213', '2113', '1222']
tgt = list({tuple(sorted(x)):x for x in src}.values())
print(src)
print(tgt)
 
Nahoru Odpovědět
25.9.2014 19:58
Avatar
coells
Tvůrce
Avatar
Odpovídá na Adam Ježek
coells:25.9.2014 20:03

Když už jsme u toho Pythonu, tak tohle vynásobí číslice ve stringu

reduce(int.__mul__, map(int, '234'))

A místo proměnné "obsahuje" stačí použít else větev for-cyklu

for a in vystup:
  if a in vystup2:
    break
else:
  vystup2.append(a)
 
Nahoru Odpovědět
25.9.2014 20:03
Avatar
Adam Ježek
Tvůrce
Avatar
Odpovídá na coells
Adam Ježek:25.9.2014 20:05

nuly nebudou problém, taky se jedná o výpočet možných hodů kostek, na kterých jsou čísla 1-6 :)
Ale ten tvuj je lepší, nechal v listu o jednu hodnotu víc než já, takže tam mam někde chybu (tipuju to na to, že 22 a 14 bere program jako stejnou hodnotu (4) :D )

Editováno 25.9.2014 20:10
Nahoru Odpovědět
25.9.2014 20:05
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
coells
Tvůrce
Avatar
Odpovídá na Adam Ježek
coells:25.9.2014 20:35
# reduce(int.__mul__, map(int, '234'))

it = map(int, '234')
result = reduce(int.__mul__, it)

map aplikuje funkci int() postupně na každou hodnotu z iterátoru
reduce aplikuje funkci int.__mul__ postupně na dvojice hodnot

def map(func, iterable):
        for i in iter(iterable):
                yield func(i)

def reduce(func, iterable):
        it = iter(iterable)
        j = next(it)
        for i in it:
                j = func(j, i)
        return j

print(list(map(int, '234')))
print(reduce(int.__mul__, [2,3,4]))
 
Nahoru Odpovědět
25.9.2014 20:35
Avatar
Adam Ježek
Tvůrce
Avatar
Odpovídá na coells
Adam Ježek:25.9.2014 20:37

já měl namysli spíše tu první verzi:

tgt = list({tuple(sorted(x)):x for x in src}.values())
Nahoru Odpovědět
25.9.2014 20:37
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Adam Ježek
gcx11:25.9.2014 20:44

A co tohle:

mnozina = set()
for hodnota in vystup:
    mnozina.update(["".join(sorted(hodnota)), ""])
mnozina.remove("")
 
Nahoru Odpovědět
25.9.2014 20:44
Avatar
coells
Tvůrce
Avatar
Odpovídá na Adam Ježek
coells:25.9.2014 20:47

Aha, schopnost jasně se vyjadřovat nepatří mezi tvoje silné stránky, že? :-)

tgt = list({tuple(sorted(x)):x for x in src}.values())

# převede string na seřazené pole znaků a vytvoří z něj tuple, protože ten jde vložit do dictionary jako klíč
def ts(x):
  return tuple(sorted(x))

# vytvoří dictionary: pro každou hodnotu z src bude klíč identický pro všechny duplicitní hodnoty, hodnota bude původní string
unique = {ts(x):x for x in src}

# hodnoty z dictionary, klíče už můžeme ignorovat
vals = unique.values()

# vytvoření listu
tgt = list(vals)
 
Nahoru Odpovědět
25.9.2014 20:47
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na coells
gcx11:25.9.2014 20:53

Na co slovník? Množina je IMHO lepší.

 
Nahoru Odpovědět
25.9.2014 20:53
Avatar
Adam Ježek
Tvůrce
Avatar
Odpovídá na coells
Adam Ježek:25.9.2014 20:59

díky :)

Nahoru Odpovědět
25.9.2014 20:59
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
coells
Tvůrce
Avatar
Odpovídá na gcx11
coells:25.9.2014 21:07

Množina by byla IMHO lepší, pokud by naše řešení byla identická, jenže to nejsou. Tvůj kód totiž nevyhazuje duplicity z původních hodnot a tedy nesplňuje zadání. To byl také důvod, proč jsem se na začátku ptal na více detailů, a proč jsem množiny nepoužil.

 
Nahoru Odpovědět
25.9.2014 21:07
Avatar
hanpari
Tvůrce
Avatar
Odpovídá na Adam Ježek
hanpari:26.9.2014 13:25

Co se týče těch kostek, nejde ti o toto, třeba pro dvě kostky?:

from itertools import product
vysledky = [(x,y) for x,y in product(range(1,7), range(1,7)) ]

\---

Editováno 26.9.2014 13:26
 
Nahoru Odpovědět
26.9.2014 13:25
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.