Diskuze: redukce "duplicitních" hodnot v listu

Tvůrce

Zobrazeno 14 zpráv z 14.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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?
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
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)
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)
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) )
# 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]))
já měl namysli spíše tu první verzi:
tgt = list({tuple(sorted(x)):x for x in src}.values())
A co tohle:
mnozina = set()
for hodnota in vystup:
mnozina.update(["".join(sorted(hodnota)), ""])
mnozina.remove("")
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)
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.
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)) ]
\---
Zobrazeno 14 zpráv z 14.