Aplică funcția la fiecare element al unei liste (Programare, Python, Lista, Funcție)

shantanuo a intrebat.

Cum se aplică o funcție la lista de intrări de variabile?De ex. filter funcția returnează valori adevărate, dar nu și ieșirea efectivă a funcției.

from string import upper
mylis=['this is test', 'another test']

filter(upper, mylis)
['this is test', 'another test']

Ieșirea așteptată este :

['THIS IS TEST', 'ANOTHER TEST']

Știu upper este încorporată. Acesta este doar un exemplu.

3 răspunsuri
mdml

Cred că vrei să folosești map în loc de filter:

>>> from string import upper
>>> mylis=['this is test', 'another test']
>>> map(upper, mylis)
['THIS IS TEST', 'ANOTHER TEST']

Chiar mai simplu, ai putea folosi str.upper în loc să importați din string (mulțumită lui @alecxe):

>>> map(str.upper, mylis)
['THIS IS TEST', 'ANOTHER TEST']

În Python 2.x, map construiește o nouă listă prin aplicarea unei anumite funcții la fiecare element dintr-o listă. filter construiește o nouă listă prin restricționarea la elementele care se evaluează la True cu o funcție dată.

În Python 3.x, map și filter construiesc iteratori în loc de liste, astfel încât, dacă utilizați Python 3.x și aveți nevoie de o listă, abordarea de înțelegere a listei ar fi mai potrivită.

Comentarii

  • map(str.upper, mylis) ar funcționa și ea, ar ajuta la evitarea unui string import. –  > Por alecxe.
  • Rețineți că map construiește doar un list pe python2.x — Pe python3.x returnează un iterator. În mod frecvent, acest lucru nu contează, dar dacă aveți nevoie de de o listă ca ieșire, atunci probabil că este mai bine să folosiți o înțelegere a listei, ca în celălalt răspuns. –  > Por mgilson.
  • Abordarea este aceeași pentru funcțiile cu efect secundar? –  > Por Ivan Balashov.
  • În Python 3.x, puteți face list(map(str.upper, mylis)), , dacă doriți listă. –  > Por BlueManCZ.
alecxe

Sau, alternativ, puteți lua un list comprehension abordare:

>>> mylis = ['this is test', 'another test']
>>> [item.upper() for item in mylis]
['THIS IS TEST', 'ANOTHER TEST']

Comentarii

  • Personal, prefer asta. Deci, Python. –  > Por OJFord.
  • nu ar fi mult mai lentă bucla printr-o listă? –  > Por john ktejik.
  • Dacă doriți o listă ca ieșire, atunci cu siguranță acest lucru funcționează mai bine decât orice –  > Por Dl Suryaa Jha.
  • Pentru a obține o listă din abordarea funcțională, returnați list(map(str.upper, mylist)) –  > Por Pablo Adames.
  • Ceva de genul acesta ar fi foarte convenabil: mylist = mylist.apply(lambda x: x.upper()) ; Abordare F#-ish, foarte compactă și ușor de citit; din câte știu eu, nu există o astfel de structură acum, dar poate în viitor Pythons? –  > Por OverInflatedWalrus.
efimp

Uneori trebuie să aplicați o funcție membrilor unei liste în loc. Următorul cod a funcționat pentru mine:

>>> def func(a, i):
...     a[i] = a[i].lower()
>>> a = ['TEST', 'TEXT']
>>> list(map(lambda i:func(a, i), range(0, len(a))))
[None, None]
>>> print(a)
['test', 'text']

Vă rugăm să rețineți, rezultatul din map() este transmisă la funcția list pentru a se asigura că lista este convertită în Python 3. Lista returnată, completată cu None ar trebui ignorată, deoarece scopul nostru a fost de a converti lista a în loc de

Comentarii

  • O sugestie: nu creați o listă plină cu Nones doar pentru a o arunca imediat, utilizați any în loc de list în jurul map. De asemenea, utilizați range cu un singur argument, intervalul va începe de la 0, la fel ca în cazul indicilor de listă. Rezultatul final: any(map(lambda i:func(a, i), range(len(a)))). Această expresie va returna False , dar acest lucru poate fi ignorat. –  > Por ack.