将函数应用于列表的每个元素
Posted
技术标签:
【中文标题】将函数应用于列表的每个元素【英文标题】:Apply function to each element of a list 【发布时间】:2014-09-24 18:51:39 【问题描述】:如何将函数应用于变量输入列表?
例如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
是内置的。这只是一个例子。
【问题讨论】:
【参考方案1】:我认为您的意思是使用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 中,map
和 filter
构造迭代器而不是列表,因此如果您使用 Python 3.x 并需要列表,则列表解析方法会更适合。
【讨论】:
map(str.upper, mylis)
也可以,有助于避免 string
导入。
请注意 map
仅在 python2.x 上构造 list
-- 在 python3.x 上它返回一个迭代器。通常这并不重要,但是如果您需要一个列表作为输出,那么最好使用列表推导式作为另一个答案。
副作用函数的方法是否相同?
在 Python 3.x 中,您可以使用 list(map(str.upper, mylis))
,如果您使用 want list。【参考方案2】:
或者,您也可以采用list comprehension 方法:
>>> mylis = ['this is test', 'another test']
>>> [item.upper() for item in mylis]
['THIS IS TEST', 'ANOTHER TEST']
【讨论】:
我个人更喜欢这个。所以 Python。 循环遍历列表不会慢很多吗? 如果你想要列表作为输出,那么这绝对比任何东西都好 从函数式方法获取列表返回list(map(str.upper, mylist))
类似的东西会很方便: mylist = mylist.apply(lambda x: x.upper()) ; F#-ish 方法,非常紧凑且易于阅读;据我所知,现在没有这样的结构,但将来可能是 Pythons?【参考方案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 值应该被忽略,因为我们的目的是在原地转换列表 a
【讨论】:
一个建议:不要创建一个充满None
s 的列表,只是为了立即将其丢弃,使用any
而不是list
周围的map
。此外,仅使用一个参数使用range
,范围将从 0 开始,与列表索引相同。最终结果:any(map(lambda i:func(a, i), range(len(a))))
。此表达式将返回 False
,但可以忽略。以上是关于将函数应用于列表的每个元素的主要内容,如果未能解决你的问题,请参考以下文章