是否有Pythonic方法迭代“扩展”源列表?

时间:2016-01-26 00:49:57

标签: python

我创建了一个生成器表达式,它使用多个源键来构建字典,如下所示:

$nx = ($nx >> 1) ^ (-($nx & 1));
$ny = ($ny >> 1) ^ (-($ny & 1));

我想知道是否有更“pythonic”的方法来做这样的事情。似乎我遇到的所有标准库函数迭代遍历列表将返回与原始列表相等或更小的长度,但在这种情况下,我想迭代扩展的结果。

3 个答案:

答案 0 :(得分:7)

您可以使用多级生成器:

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

答案 1 :(得分:3)

在这种情况下,您可以使用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'])):

答案 2 :(得分:1)

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

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