【问题标题】:dictionary group by substring of key字典按键的子串分组
【发布时间】:2021-11-01 23:57:01
【问题描述】:

在 Python3 中,我有一个字典 {k = episode : value = count},但我不知道如何按键的子字符串对值求和。

输入:

dict = {'S01E01': 27, 'S01E02': 27, 'S01E03': 32, 'S01E04': 36, 'S01E05': 35, 'S01E06': 31,
 'S02E01': 33, 'S02E02': 21, 'S02E03': 20, 'S02E04': 29, 'S02E05': 33, 'S02E06': 42}

想要的输出:

output_dict = {'S01': 188 , 'S02' : 178}

我尝试建立一个季节的中间列表,并尝试使用 reduce 和 counter 功能,但没有成功。

List = ['S01', 'S02']

还尝试在此处查找任何结果,但找不到任何结果。可能是错误的术语。任何帮助,将不胜感激。 谢谢

【问题讨论】:

    标签: python python-3.x dictionary sum


    【解决方案1】:

    Onyambu 的答案可能是解决此问题的更 Pythonic 方式,但如果您正在寻找一种更适合人类阅读的解决方案,适合此特定用例,那么您可以这样做:

    episodes = {'S01E01': 27, 'S01E02': 27, 'S01E03': 32, 'S01E04': 36, 'S01E05': 35, 'S01E06': 31,
     'S02E01': 33, 'S02E02': 21, 'S02E03': 20, 'S02E04': 29, 'S02E05': 33, 'S02E06': 42}
    
    output = {}
    
    for episode in episodes:
        season = episode[0:3] #Gets the first 3 characters
        if season not in output:
            output[season] = episodes[episode] 
        else:
            output[season] += episodes[episode]
    print(output)
    

    【讨论】:

    • 确实,这些术语表达了更多的逻辑。谢谢
    【解决方案2】:

    使用dict理解:

     from itertools import groupby
    
     {key:sum(list(zip(*val))[1]) for key, val in groupby(d.items(), key = lambda x:x[0][:3])}
      Out: {'S01': 188, 'S02': 178}
    

    使用正常的 for 循环首先将您的数据保存为d。然后delete dict,因为它是一个内部函数,即del dict。现在可以运行以下代码

    result = dict()
    
    for key, val in d.items():
        var1 = key[:3]
        if not result.get(var1):
            result[var1] = 0
        result[var1]  += val
    

    【讨论】:

    • 感谢您的解释,这样就可以了!
    【解决方案3】:

    我假设子键只有 3 个字符长。

    dic = {'S01E01': 27, 'S01E02': 27, 'S01E03': 32, 'S01E04': 36, 'S01E05': 35, 'S01E06': 31,
     'S02E01': 33, 'S02E02': 21, 'S02E03': 20, 'S02E04': 29, 'S02E05': 33, 'S02E06': 42}
    

    首先提取唯一的子键:

    subkeys = set([key[:3] for key in dic.keys()])
    

    然后,使用字典推导来总结每个子键的值。

    out = {subkey: sum([value for key, value in dic.items() if subkey in key]) for subkey in subkeys}
    

    更丑的单线:

    out = {subkey[:3]: sum([value for key, value in dic.items() if subkey[:3] in key]) for subkey in dic.keys()}
    

    【讨论】:

      【解决方案4】:

      另一种方法:

      data = {'S01E01': 27, 'S01E02': 27, 'S01E03': 32, 'S01E04': 36, 'S01E05': 35, 'S01E06': 31,
       'S02E01': 33, 'S02E02': 21, 'S02E03': 20, 'S02E04': 29, 'S02E05': 33, 'S02E06': 42}
      from itertools import groupby
      out = {}
      for key, value in groupby(data, lambda x:x[:3]):
          out[key] = sum([data[val] for val in list(value)])
      print (out)
      

      输出:

      {'S01': 188, 'S02': 178}
      

      【讨论】:

        猜你喜欢
        • 2020-04-16
        • 2012-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-06
        • 1970-01-01
        相关资源
        最近更新 更多