什么';这是将(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
就是这样做的。不幸的是,我事先不知道全部因素。这是一个简化的例子。