Avatar
Adam Ježek
Tým ITnetwork
Avatar
Adam Ježek:

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
Programátor dělá co může. Počítač co chce. | Pokud mi dáš mínus, tak prosim, napiš proč!
Avatar
coells
Redaktor
Avatar
Odpovídá na Adam Ježek
coells:

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
Tým ITnetwork
Avatar
Odpovídá na coells
Adam Ježek:

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  -2 25.9.2014 19:44
Programátor dělá co může. Počítač co chce. | Pokud mi dáš mínus, tak prosim, napiš proč!
Avatar
coells
Redaktor
Avatar
Odpovídá na Adam Ježek
coells:

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  +2 25.9.2014 19:58
Avatar
coells
Redaktor
Avatar
Odpovídá na Adam Ježek
coells:

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
Tým ITnetwork
Avatar
Odpovídá na coells
Adam Ježek:

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
Programátor dělá co může. Počítač co chce. | Pokud mi dáš mínus, tak prosim, napiš proč!
Avatar
coells
Redaktor
Avatar
Odpovídá na Adam Ježek
coells:
# 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
Tým ITnetwork
Avatar
Odpovídá na coells
Adam Ježek:

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
Programátor dělá co může. Počítač co chce. | Pokud mi dáš mínus, tak prosim, napiš proč!
Avatar
gcx11
Redaktor
Avatar
Odpovídá na Adam Ježek
gcx11:

A co tohle:

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

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  +1 25.9.2014 20:47
Avatar
gcx11
Redaktor
Avatar
Odpovídá na coells
gcx11:

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

 
Nahoru Odpovědět  +1 25.9.2014 20:53
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Nahoru Odpovědět 25.9.2014 20:59
Programátor dělá co může. Počítač co chce. | Pokud mi dáš mínus, tak prosim, napiš proč!
Avatar
coells
Redaktor
Avatar
Odpovídá na gcx11
coells:

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
Redaktor
Avatar
Odpovídá na Adam Ježek
hanpari:

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.