繁体   English   中英

将 function 应用于列表的每个元素

[英]Apply function to each element of a list

假设我有一个像这样的列表:

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

如何将 function 应用于列表中的每个元素? 例如,我如何应用str.upper来获得:

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

我认为您的意思是使用map而不是filter

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

更简单的是,您可以使用str.upper而不是从string导入(感谢@alecxe):

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

在 Python 2.x 中, map通过将给定函数应用于列表中的每个元素来构造一个新列表。 filter通过限制使用给定函数评估为True的元素来构造一个新列表。

在 Python 3.x 中, mapfilter构造迭代器而不是列表,因此如果您使用 Python 3.x 并需要列表,则列表推导方法会更适合。

或者,或者,您可以采用列表理解方法:

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

有时您需要将功能应用于列表的成员。 以下代码对我有用:

>>> 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()的输出被传递给列表构造函数,以确保列表在 Python 3 中被转换。应该忽略填充为None值的返回列表,因为我们的目的是就地转换列表a

Python 中的字符串方法经过优化,因此您会发现此处其他答案( 1、2 )中提到的循环实现比执行相同任务的其他库(例如 pandas 和numpy )中的矢量化方法更快。

通常,您可以使用列表理解或map()将 function 应用于列表中的每个元素,如其他答案中所述。 例如,给定一个任意的 function 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运算符库,以了解构建 function 以应用于每个元素的内置方法。 例如,如果你想将列表中的每个元素乘以 2,你可以使用itertools.repeatoperator.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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM