Mi lehet a lista "eltűnés" oka? (python 3.6.9)
Két példát mutatok, az első működik, a második nem. Az a kérdés, hogy második miért nem.
1. példa:
>>> lista = [1, 2, 3, 4, 5]
>>> filtered1 = filter(lambda n: n%2, lista)
>>> filtered2 = filter(lambda n: n%3, filtered1)
A 3.x verziójú pythonban a filter list helyett egy filter objectet ad vissza, ami iterálható. A második filter alkalmazható az objectre.
>>> list(filtered2)
[1, 5]
2. Példa (a lista változót felülírogatom)
>>> lista = [1, 2, 3, 4, 5]
>>> lista = filter(lambda n: n%2, lista) # ez még működik
>>> lista = filter(lambda n: n%3, lista) # a lista üres iterátor lesz
>>> list(lista)
[]
A példából elég jól látszik, hogy mit "nem szabad", de szeretném érteni, hogy miért.
Azon gondolkoztam, hogy ez a hiba ahhoz hasonlít, mintha egy iterátor kimerülne.
>>> it = iter([1,2,3,4,5])
>>> list(it)
[1,2,3,4,5]
>>> list(it)
[]
A dokumentáció ezt írja:
"Note that filter(function, iterable) is equivalent to the generator expression (item for item in iterable if function(item))
Ha ekvivalens, akkor kipróbáltam.
>>> test1 = lambda n: n%2
>>> test2 = lambda n: n%3
>>> lista = [1,2,3,4,5]
>>> lista = (item for item in lista if test1(item))
>>> lista = (item for item in lista if test2(item))
>>> list(lista)
[1, 5]
Úgy tűnik, annyira mégsem ekvivalens...
A fő probléma az, hogy a Python 2 filter() egy iterálható listát ad vissza:
"Construct a list from those elements of iterable for which function returns true."
a Python 3 meg Iterátor objektumot ( [link] ):
"Construct an iterator from those elements of iterable for which function returns true."
ha egymás után akarsz használni több filter-t, alakítsd át az Iterator objektumot listává:
lista = [1, 2, 3, 4, 5]
iterator = filter(lambda n: n%2, lista)
iterator = filter(lambda n: n%3, list(iterator))
print(list(iterator)) # [1, 5]
"map() and filter() return iterators. If you really need a list and the input sequences are all of equal length, a quick fix is to wrap map() in list()"
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!