我有一个如下所示的数据结构:
data = [
(16, 'a'),
(12, 'b'),
(21, 'c'),
(30, 'b'),
(17, 'd'),
...
]
数字很大(超过32位),非顺序,非唯一,而不是有序。字符串可能重复。
我有一台发电机:
def factors(n):
for d in range(2, 5):
if n % d == 0:
yield n
它可以生成零个或多个值。每个输入的结果都不是唯一的。我需要的是:
result = {
2: ['a', 'b', 'b'], # 16, 12, 30
3: ['b', 'c', 'b'], # 12, 21, 30
4: ['a', 'b'] # 16, 12
]
我希望尽可能接近标准的Python模块(没有numpy)。我得到的最好的是:
result = {}
for a, b in data:
for c in factors(a):
result.setdefault(c).append(b)
但这感觉很奇怪,而且我习惯于Python更优雅地处理这样的事情。
答案 0 :(得分:1)
您首先在data
上进行迭代,然后在factors
上进行迭代。我会采取相反的方式,因为这样result
构建得更加自然:
result = {}
for d in range(2, 5):
result[d] = [b for (a,b) in data if a % d == 0]
或者如果你有足够的勇气去做双重理解:
result = dict((d, [b for (a,b) in data if a % d == 0]) for d in range(2, 5))