将函数应用于列表的每个元素


75

如何将函数应用于变量输入列表?例如,filter函数返回真值,但不返回函数的实际输出。

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

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

预期的输出是:

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

我知道upper是内置的。这只是一个例子。

Answers:


98

我认为您的意思是使用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和要求的清单列表解析的方法会更适合。


3
map(str.upper, mylis)也会起作用,有助于避免string导入。
alecxe 2014年

4
请注意,maplist在python2.x上构造一个-在python3.x上它返回一个迭代器。通常,这无关紧要,但是,如果需要列表作为输出,那么最好使用列表推导(如在其他答案中那样)。
mgilson

1
副作用功能的方法是否相同?
伊万·巴拉索夫

6
在Python 3.x中,你可以做list(map(str.upper, mylis)),如果你想列表
BlueManCZ

90

或者,您也可以采用以下list comprehension方法:

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

2
我个人更喜欢这个。Python。
OJFord

2
遍历列表会不会慢得多?
约翰·克特吉克

如果您希望将列表作为输出,那么绝对比任何方法都更好
Suryaa Jha先生,

3
要从功能方法中获取列表,请返回list(map(str.upper, mylist))
Pablo Adames

5
这样的事情将非常方便:mylist = mylist.apply(lambda x:x.upper()); F#-ish方法,非常紧凑且易于阅读;据我所知,现在没有这样的结构,但是将来可能是Python吗?
OverInflatedWalrus

0

有时,您需要将函数应用于适当的列表成员。以下代码为我工作:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.