我创建了一个生成器表达式,它使用多个源键来构建字典,如下所示:
$nx = ($nx >> 1) ^ (-($nx & 1));
$ny = ($ny >> 1) ^ (-($ny & 1));
我想知道是否有更“pythonic”的方法来做这样的事情。似乎我遇到的所有标准库函数迭代遍历列表将返回与原始列表相等或更小的长度,但在这种情况下,我想迭代扩展的结果。
答案 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}