什么';这是将(d1,d2)[]转换为{d3:d2[]}的最具python风格的方式,其中g(d1)生成d3[]
我的数据结构如下所示:什么';这是将(d1,d2)[]转换为{d3:d2[]}的最具python风格的方式,其中g(d1)生成d3[],python,Python,我的数据结构如下所示: 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 它可以生成零个或多个值。每个输入的结果不是唯
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更优雅地处理类似的事情。首先迭代
数据,然后迭代因子。我会用另一种方法,因为这样结果
构建起来更自然:
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))
为什么这些因素会停在4
?…不,这似乎就是你应该做的!(您可以使用defaultdict(list)
而不是setdefault
,不过,假设您的实际代码是setdefault(c,[])
。@MosesKoledoye 4个因素对任何人来说都足够了(哈哈)。实际上,这是为了证明清单可以复制。如果列表中有12和24,则两者都将生成[2,3,4]。例如,在草稿中,我猜它被删除了。使用setdefault
或defaultdict
就是这样做的。不幸的是,我事先不知道全部因素。这是一个简化的例子。