【问题标题】:Python, print out keys of element sums of each possible combinations in a dictionaryPython,打印出字典中每个可能组合的元素总和的键
【发布时间】:2018-08-29 06:38:46
【问题描述】:

创建以下行来迭代和总结字典中每个可能的元素组合。例如,如果字典的长度是 5,我想要任何 2 个元素、任何 3 个元素、任何 4 个元素的总和。

import itertools

di = {'a': 1, 'b': 2, 'c': 34, 'd': 24}

dict_len = range(len(di)-2, len(di))

for l in dict_len:
    d_values = list(itertools.combinations(di.values(), l))
    for d in d_values:
        print d

输出:

35
3
25
36
58
26
37
59
27
60

如何将值的键也打印出来?喜欢:

a + c = 35
a + b = 3
a + d = 25
b + c = 36
c + d = 58
b + d = 26
a + b + c =37
a + c + d =59
a + b + d =27
c + b + d =60

谢谢。

【问题讨论】:

    标签: python dictionary iteration combinations


    【解决方案1】:

    要获得所需的输出(如问题中所述):

    import itertools
    
    di = {'a': 1, 'b': 2, 'c': 34, 'd': 24}
    
    dict_len = range(len(di)-2, len(di))
    
    for l in dict_len:
        d_values = list(itertools.combinations(di.values(), l))
        d_keys = list(itertools.combinations(di.keys(), l))
        for i in range(len(d_values)):
            print " + ".join(d_keys[i]), "=", sum(d_values[i])
    

    输出:

    a + c = 35
    a + b = 3
    a + d = 25
    c + b = 36
    c + d = 58
    b + d = 26
    a + c + b = 37
    a + c + d = 59
    a + b + d = 27
    c + b + d = 60
    

    【讨论】:

      【解决方案2】:

      你可以这样:

      di = {'a': 1, 'b': 2, 'c': 34, 'd': 24}
      
      dict_len = range(len(di)-2, len(di))
      
      for l in dict_len:
          d_values = list(itertools.combinations(di.values(), l))
          d_keys =  list(itertools.combinations(di.keys(), l))
          for d,k in zip(d_values,d_keys):
              print(k,sum(d))
      

      生成输出:

      ('a', 'b') 3
      ('a', 'c') 35
      ('a', 'd') 25
      ('b', 'c') 36
      ('b', 'd') 26
      ('c', 'd') 58
      ('a', 'b', 'c') 37
      ('a', 'b', 'd') 27
      ('a', 'c', 'd') 59
      ('b', 'c', 'd') 60
      

      【讨论】:

      • 谢谢。然而,另一个答案给出了我想要的。 :)
      【解决方案3】:

      有趣的问题。你可以这样做:

      import itertools
      
      di = {'a': 1, 'b': 2, 'c': 34, 'd': 24}
      
      for n in range(2, len(di)):
        for pairs in itertools.combinations(di.items(), n):
            keys, values = zip(*pairs)  # Note 1
            print("{} = {}".format(' + '.join(keys), sum(values)))
      

      导致

      a + b = 3
      a + c = 35
      a + d = 25
      b + c = 36
      b + d = 26
      c + d = 58
      a + b + c = 37
      a + b + d = 27
      a + c + d = 59
      b + c + d = 60
      

      注意事项:

      1. 注意zip(*iterable) 结构改变了分组顺序。例如,它将您从[('foo', 1), ('bar', 2)] 带到[('foo', 'bar'), (1, 2)],从而有效地将keysvalues 组合在一起。

      【讨论】:

      • 谢谢你的好台词!希望你不介意我选择了更容易理解的答案,尤其是对于初学者。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 2022-01-25
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多