有没有一种Pythonic方法可以迭代“扩展”源代码列表?

2024-10-03 21:31:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个生成器表达式,该表达式使用的不仅仅是源键,而是字典,如下所示:

def moreIter(names):
    for name in names:
        yield name
        yield name + "Bar"

KEYS = ("a", "b")

src = {"a": 1, "aBar": 2, "b": 3, "bBar": 4, "c": 0, "cBar": 1, "d": 10}
d = {key: src[key] for key in moreIter(KEYS)}

我想知道是否有一个更“Python”的方式来做这样的事情。似乎我遇到的所有遍历列表的标准库函数都会返回与原始列表长度相等或更小的值,但在本例中,我希望遍历扩展的结果。你知道吗


Tags: keynameinsrc列表for字典names
3条回答

您可以使用多级生成器:

src = {"a": 1, "aBar": 2, "b": 3, "bBar": 4}
d = {key: src[key] for item in 'ab' for key in (item, item+'Bar')}

对于这个问题,moreIter(KEYS)返回src的键。所以:

>>> d = {k:src[k] for k in src.keys()}
>>> d
{'a': 1, 'aBar': 2, 'b': 3, 'bBar': 4}

在这种情况下可以使用itertools.product。这实际上取决于加法键的复杂程度:

from itertools import product

for name in map(''.join, product(['a', 'b'], ['', 'Bar'])):
    yield name

# ['a', 'aBar', 'b', 'bBar']

product生成元组列表

[('a', ''), ('a', 'Bar'), ('b', ''), ('b', 'Bar')]

然后map使用''.join函数将每个元组组合成一个字符串(您可以在这里使用列表理解,而不是map,但我认为这会降低可读性,因为它已经在for循环中)。你知道吗

for name in (''.join(t) for t in  product(['a', 'b'], ['', 'Bar'])):

相关问题 更多 >