Kezdőoldal » Számítástechnika » Programozás » Mi lehet a lista "eltűnés"...

Ozmium42 kérdése:

Mi lehet a lista "eltűnés" oka? (python 3.6.9)

Figyelt kérdés

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.



#filter #Python #iterator #iterable
2020. máj. 16. 18:32
 1/5 A kérdező kommentje:

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...

2020. máj. 16. 19:08
 2/5 anonim ***** válasza:
77%

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."

[link]


a Python 3 meg Iterátor objektumot ( [link] ):

"Construct an iterator from those elements of iterable for which function returns true."

[link]


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()"

[link]

2020. máj. 16. 19:45
Hasznos számodra ez a válasz?
 3/5 A kérdező kommentje:
Ez a kérdés nem arra megy ki, hogyan lehet megkerülni ezt a problémát, hanem arra próbálok rájönni, hogy mi okozza. Én úgy látom, hogy semmi nem indokolja (python verzió sem!), hogy a 2. példa ne működjön pontosan úgy, mint amit az első hozzászólásban bemutattam.
2020. máj. 16. 20:31
 4/5 anonim ***** válasza:
77%
Mivel az értékadással felülírod az iterátort, már nem lesz amin végigmenjen. Ha más nevet adsz neki, akkor működik. Listává meg csak akkor alakítsd ha muszáj.
2020. máj. 16. 21:27
Hasznos számodra ez a válasz?
 5/5 A kérdező kommentje:
#4 Nem, ennek így működnie kell, és működik is. Most már kiderült, mi a hiba: ha listává alakítom az iterátort, hogy megnézzem az értékeit, azzal kimerítem, és aztán a következő filter a kimerített iterátorral dolgozik tovább. Szóval a 2. példa az itt közölt formában működik, csak én a sorok között tesztelgettem is, hogy mi van éppen az iterátorban, és ezzel rontottam el.
2020. máj. 16. 22:10

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!