有没有一种简单的方法来执行每个元素?

4

普通方式:

for x in myList:
    myFunc(x)

你必须使用一个变量 x

使用

map(myFunc,myList)

实际上,你必须使用这个来使上述工作。
list(map(myFunc,myList))

有人建议我建一个列表,但我并不需要建立一个列表。

也许有人会建议我这样做。

def func(l):
   for x in l:
        ....

这是另一个话题。 有类似这样的东西吗?
every(func,myList)

你的问题是 - 如何为某个列表中的每个元素执行一个函数? 使用 map() 有什么问题吗? - Burhan Khalid
@BurhanKhalid 它在内存中构建了一个列表(很可能是None的列表)。 - jamylak
1
for循环(或类似的列表推导式)对我来说似乎相当简洁。有时,让事情尽可能地简短更多是一种执念而不是好习惯。简洁有助于可读性,但只有到一定程度。自然语言之所以有很多冗余,是有原因的。 - user180247
3个回答

6
“正常方式”肯定是最好的方式,尽管itertools提供了“consume”配方,无论出于何种原因需要它:
import collections
from itertools import islice

def consume(iterator, n):
    "Advance the iterator n-steps ahead. If n is none, consume entirely."
    # Use functions that consume iterators at C speed.
    if n is None:
        # feed the entire iterator into a zero-length deque
        collections.deque(iterator, maxlen=0)
    else:
        # advance to the empty slice starting at position n
        next(islice(iterator, n, n), None)

这个可以像这样使用:
consume(imap(func, my_list), None) # On python 3 use map

这个函数的执行速度最快,因为它避免了使用Python循环的开销,而是使用在C端运行的函数。


1
这很好,但这就像用大炮在纸上打洞 - 我想知道OP使用map()的问题是什么。 - Burhan Khalid
@BurhanKhalid 我在上面回复了你的评论 :) - jamylak
你可以使用 itertools.imap 代替生成器表达式(因为你已经在使用 itertools)。 - David Robinson
@DavidRobinson 我不确定是否要这样做,因为Python 3有所不同,但我会提供两种选择。 - jamylak

3
据我所知,标准库中没有“foreach”快捷方式,但是很容易实现这样的功能:
def every(fun, iterable):
    for i in iterable:
        fun(i)

0

如果你只想让myList被修改,以包含myFunc(x)对于myList中的所有x,那么你可以尝试使用列表推导式,它也需要一个变量,但不会让变量泄漏出推导式的作用域:

myList = [myFunc(x) for x in myList]

希望能有所帮助。

1
"那会建立一个列表,我不需要建立一个列表。" - jamylak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接