【问题标题】:is there some way execute every element simply?有没有办法简单地执行每个元素?
【发布时间】:2012-09-15 12:43:07
【问题描述】:

正常方式:

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() 有什么问题?
  • @BurhanKhalid 它在内存中建立一个列表(很可能是Nones 的列表)。
  • for 循环(或类似的列表理解)对我来说似乎非常简洁。有时,让事情尽可能简短更像是一种痴迷而不是一种好习惯。简洁有利于可读性,但仅在一定程度上。自然语言有很多冗余是有原因的。

标签: python python-3.x


【解决方案1】:

“正常方式”绝对是最好的方式,尽管 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

此函数执行速度最快,因为它通过使用在 C 端运行的函数避免了 python for 循环开销。

【讨论】:

  • 这很好,但就像使用佳能在纸上打孔一样 - 我想知道 OP 使用 map() 有什么问题。
  • @BurhanKhalid 我在上面回复了你的评论 :)
  • 你可以使用itertools.imap代替生成器表达式(因为你已经在使用itertools)
  • @DavidRobinson 由于 Python 3 的差异,我不确定是否要这样做,但我会提供两种选择。
【解决方案2】:

AFAIK 标准库中没有“foreach”快捷方式,但这样的东西很容易实现:

def every(fun, iterable):
    for i in iterable:
        fun(i)

【讨论】:

    【解决方案3】:

    如果您只想将myList 修改为包含myFunc(x) 以包含myList 中的所有x,那么您可以尝试列表推导,它也需要一个变量,但不会让变量泄漏到范围之外的理解:

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

    希望有帮助

    【讨论】:

    • "会建立一个列表,我不需要建立一个列表"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 2020-03-16
    • 2019-04-14
    • 2022-01-05
    • 1970-01-01
    • 2015-08-04
    相关资源
    最近更新 更多