【问题标题】:How to sum-up the last number/element in the list of tuples having multiple criteria?如何总结具有多个条件的元组列表中的最后一个数字/元素?
【发布时间】:2020-05-11 09:08:52
【问题描述】:

samplelist = [('A', 'Pass', 10), ('A', 'Pass', 20), ('A', 'Failed', 5), ('B', 'Pass' , 10), ('B', '通过', 5) ]

预期输出 = [('A', 'Pass', 30), ('A', 'Failed', 5), ('B', 'Pass', 15) ]

我使用此代码作为我的参考,但仍然无法让它工作:

samplelist = [('A', 'Pass', 10), ('A', 'Pass', 20), ('A', 'Failed', 5), ('B', 'Pass', 10), ('B', 'Pass', 5) ]

i used this code as my reference but still cant get it to work :


from collections import defaultdict

d = defaultdict(int)
for letter, value in samplelist:
    d[letter] += value
res = list(d.items())
print(res)
# expected output = [('A', 'Pass', 30), ('A', 'Failed', 5), ('B', 'Pass', 15) ]

【问题讨论】:

    标签: python python-3.x list for-loop tuples


    【解决方案1】:

    由于列表中的每个元组中有 3 个元素,因此您需要 3 个变量来解包:

    samplelist = [('A', 'Pass', 10), ('A', 'Pass', 20), ('A', 'Failed', 5), ('B', 'Pass', 10), ('B', 'Pass', 5) ]
    
    from collections import defaultdict
    
    d = defaultdict(int)
    for letter, status, value in samplelist:
        d[(letter, status)] += value
    res = [key + (val,) for key, val in d.items()] # convert to required format
    print(res) 
    

    结果:

    [('A', 'Pass', 30), ('A', 'Failed', 5), ('B', 'Pass', 15)]
    

    【讨论】:

      【解决方案2】:

      您遇到此问题是因为:

      • 要形成的键是第一项和第二项的组合。您没有单独的 letter 分组键(这也会在前面抛出错误:'too many values to unpack')。

      使用groupby 可以更轻松地解决此问题,因为所有组似乎都相邻:

      [k + (sum(x[2] for x in g),) for k, g in groupby(samplelist, key=lambda x: x[:-1])]
      

      代码

      from itertools import groupby
      
      res = [k + (sum(x[2] for x in g),) for k, g in groupby(samplelist, key=lambda x: x[:-1])]
      

      【讨论】:

      • 感谢奥斯汀的回答。! :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多