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

sha*_*nuo 43 python function list

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

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

filter(upper, mylis)
['this is test', 'another test']
Run Code Online (Sandbox Code Playgroud)

预期的产出是:

['THIS IS TEST', 'ANOTHER TEST']
Run Code Online (Sandbox Code Playgroud)

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

mdm*_*dml 58

我认为你的意思是用map而不是filter:

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

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

>>> map(str.upper, mylis)
['THIS IS TEST', 'ANOTHER TEST']
Run Code Online (Sandbox Code Playgroud)

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

在Python 3.x中,mapfilter构建迭代器,而非列表,所以如果你使用Python 3.x和要求的清单列表解析的方法会更适合.

  • 在 Python 3.x 中,如果您[想要列表](/sf/answers/91234811/),可以执行“list(map(str.upper, mylis))”。 (9认同)
  • map(str.upper,mylis)也会起作用,有助于避免字符串的导入。 (3认同)
  • 请注意,`map`仅在python2.x上构造一个`list`;在python3.x上,它返回一个迭代器。通常,这无关紧要,但是_if_您需要一个列表作为输出,那么使用列表推导可能更好,就像在另一个答案中一样。 (2认同)

ale*_*cxe 52

或者,您可以采取一种list comprehension方法:

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

  • 类似的东西会非常方便: mylist = mylist.apply(lambda x: x.upper()) ; F# 风格的方法,非常紧凑且易于阅读;据我所知现在没有这样的结构,但将来Python可能会有? (5认同)
  • 要从函数方法获取列表,请返回 list(map(str.upper, mylist))` (3认同)
  • 我个人更喜欢这个.所以Python. (2认同)
  • 遍历列表不会慢得多吗? (2认同)

小智 9

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

>>> 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']
Run Code Online (Sandbox Code Playgroud)

请注意, map()的输出被传递给列表构造函数,以确保列表在 Python 3 中进行转换。返回的填充None值的列表应该被忽略,因为我们的目的是就地转换列表a

  • 建议:不要创建一个充满“None”的列表,然后立即将其丢弃,在“map”周围使用“any”而不是“list”。另外,使用只有一个参数的“range”,范围将从 0 开始,与列表索引相同。最终结果:`any(map(lambda i:func(a, i), range(len(a))))`。该表达式将返回 `False` ,但可以忽略。 (3认同)