Вопрос-Ответ

Apply function to each element of a list [duplicate]

Применить функцию к каждому элементу списка

Предположим, у меня есть список типа:

mylis = ['this is test', 'another test']

Как мне применить функцию к каждому элементу в списке? Например, как мне применитьstr.upper, чтобы получить:

['THIS IS TEST', 'ANOTHER TEST']
Переведено автоматически
Ответ 1

Попробуйте использовать понимание списка:

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

Использование встроенной стандартной библиотеки map:

>>> mylis = ['this is test', 'another test']
>>> list(map(str.upper, mylis))
['THIS IS TEST', 'ANOTHER TEST']

В Python 2.x map создал желаемый новый список, применив заданную функцию к каждому элементу в списке.

В Python 3.x map создает итератор вместо списка, поэтому необходим вызов list. Если вы используете Python 3.x и вам требуется список, то вам лучше подойдет подход понимания списка.

Ответ 3

Иногда вам нужно применить функцию к элементам списка на месте. Следующий код сработал для меня:

>>> 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']

Пожалуйста, обратите внимание, выходные данные map() передаются в конструктор list, чтобы убедиться, что список преобразован в Python 3. Возвращаемый список, заполненный значениями None, следует игнорировать, поскольку нашей целью было преобразовать list a на месте

Ответ 4

Строковые методы в Python оптимизированы, поэтому вы обнаружите, что реализации циклов, упомянутые в других ответах здесь (1, 2), будут быстрее, чем векторизованные методы в других библиотеках, таких как pandas и numpy, которые выполняют ту же задачу.

В общем, вы можете применить функцию к каждому элементу списка, используя понимание списка или map() как указано в других ответах здесь. Например, учитывая произвольную функцию func, вы можете либо сделать:

new_list = [func(x) for x in mylis]
# or
new_list = list(map(func, mylis))

Если вы хотите изменить список на месте, вы можете заменить каждый элемент назначением фрагмента.

# note that you don't need to cast `map` to a list for this assignment
# this is probably the fastest way to apply a function to a list
mylis[:] = map(str.upper, mylis)
# or
mylis[:] = [x.upper() for x in mylis]

или с помощью явного цикла:

for i in range(len(mylis)):
mylis[i] = mylis[i].upper()

Вы также можете проверить встроенные библиотеки itertools и operator, чтобы найти встроенные методы для построения функции, применяемой к каждому элементу. Например, если вы хотите умножить каждый элемент в списке на 2, вы можете использовать itertools.repeat и operator.mul:

from itertools import repeat, starmap
from operator import mul

newlis1 = list(map(mul, mylis, repeat(2)))
# or with starmap
newlis2 = list(starmap(mul, zip(mylis, repeat(2))))

# but at this point, list comprehension is simpler imo
newlis3 = [x*2 for x in mylis]
python string list function