将(d1,d2)[]转换为{d3:d2 []}的最pythonic方法是什么,其中g(d1)生成d3 []

时间:2017-02-13 23:13:07

标签: 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

它可以生成零个或多个值。每个输入的结果都不是唯一的。我需要的是:

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更优雅地处理这样的事情。

1 个答案:

答案 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))