繁体   English   中英

python函数产生元组,只需要一个元素

[英]python function yields tuple and only one element is wanted

我有一个功能

def f():
    # whatever
    yield (a,b)

现在我想收集所有a但不是b 此外,我希望结果aa是一个列表而不是迭代器。 现在我用

aa, _ = zip(*f())

这是空间/时间效率方面最好的吗?

zip(*seq)必须在输出列之前摄取整个生成器。 这效率不高。

坚持列表理解。 你可以使用元组赋值:

aa = [a for a, _ in f()]

或使用索引:

aa = [tup[0] for tup in f()]

如果你没有拥有可用于随机访问或其他操作的所有值必须有一个列表,你可以使用一个生成器表达式来维持记忆的效率:

aa = (a for a, _ in f())

您可以使用列表推导来抓取第一个返回的项目

aa = [result[0] for result in f()]

在不修改f情况下,你不能使它只产生元组的一个元素。 但是,您可以轻松地链接生成器,例如使用生成器表达式:

just_a_please = (a for a,b in f())

要在一次点击中使用所有a,你应该更喜欢列表理解:

all_a = [a for a,b in f()]

如果你只想要其中一个,那就是next

give_me_an_a, _b = next(f())

简单来说,你可以使用列表理解来获得整个事物的列表

aa = [ a for a,_ in f() ]

对于使用operator模块的解决方案:

from operator import itemgetter
get_first = itemgetter(0)
aa = [get_first(x) for x in f()]

编辑:我最初声明“使用operator模块的有效解决方案”,但我找不到任何证据表明它比标准列表理解方法更有效。

一些轶事%timeit观察:

def f():
    for i in xrange(0, 10000):
        yield (i, i ** i)

def operator_way():
    return [get_first(x) for x in f()]

def tuple_unpack_way():
    return [a for a, _ in f()]

def indexing_way():
    return [a[0] for a in f()]

def map_way():
    return map(get_first, f())

%timeit operator_way() # 100 loops, best of 3: 9.25 ms per loop

%timeit tuple_unpack_way() # 100 loops, best of 3: 9.28 ms per loop

%timeit indexing_way() # 100 loops, best of 3: 9.17 ms per loop

%timeit map_way() # 100 loops, best of 3: 9.07 ms per loop

他们似乎或多或少相当。 地图可能会稍微提高效率。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM