【问题标题】:Combining parts of a list inside a list在列表中组合列表的各个部分
【发布时间】:2020-07-07 16:46:07
【问题描述】:

给定一个类似的列表:

[['james',100,200,300],['james',200,300,400], ['charles',200,200,100]]

我需要添加具有相同第一个索引的两个列表的组件,如下所示:

[['james',300,500,700],['charles',200,200,100]]

感谢您的回答。刚刚发现我必须这样做而不导入任何模块。有没有办法这样做?我尝试过使用 for 循环,但找不到要索引的内容。

【问题讨论】:

  • 是什么阻止你这样做?
  • 请发布您当前对解决方案的尝试。 Stackoverflow 在这里帮助您回答问题,而不是为您解决问题。

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


【解决方案1】:
dic = {}
for row in a:
    if row[0] in dic:
        dic[row[0]] = [sum(n) for n in zip(*[dic[row[0]], row[1:]])]
    else:
        dic[row[0]] = row[1:]

ans = []
for key in dic:
    ans.append([key, *dic[key]])

您可以使用names as keyssubsequent numbers as the value 创建字典。 最后,您可以将字典转换为列表列表。

[sum(n) for n in zip(*[dic[row[0]], row[1:]])]用于总结2个对应列表的元素,参考这里:https://stackoverflow.com/a/11280563/10077354

【讨论】:

    【解决方案2】:

    你可以使用collections.defaultdict:

    from  collections import defaultdict
    
    l = [['james',100,200,300],['james',200,300,400], ['charles',200,200,100]]
    
    
    d = defaultdict(list)
    for k, *v in l:
        d[k].append(v)
    
    [[k, *[sum(e) for e in zip(*v)]] for k, v in d.items()]
    

    输出:

    [['james', 300, 500, 700], ['charles', 200, 200, 100]]
    

    不导入任何模块:

    l = [['james',100,200,300],['james',200,300,400], ['charles',200,200,100]]
    
    
    d = {}
    for k, *v in l:
        d.setdefault(k, []).append(v)
    
    [[k, *[sum(e) for e in zip(*v)]] for k, v in d.items()]
    

    输出:

    l = [['james',100,200,300],['james',200,300,400], ['charles',200,200,100]]
    

    【讨论】:

    • 稍微简单一点:d = defaultdict(lambda: [0,0,0]),然后循环体 d[k][:] = map(operator.add, d[k], v) 为您提供总和,而无需其他列表理解。
    • 没有充分的理由避免从标准库中导入模块。 (至少add 并不是真正需要的;它只是比使用lambda x, y: x = y 更有效。)
    • @chepner 我同意你的看法,我想这是学校的另一项任务,这些老师......
    【解决方案3】:
    data=[['james',100,200,300],['james',200,300,400], ['charles',200,200,100]]
    dic={}
    for sample in data:
        if sample[0] in dic.keys():
            dic[sample[0]] = [x+y for x,y in zip(dic[sample[0]],sample[1:])]
        else:
            dic[sample[0]] = sample[1:]
    data= [[x]+y for x,y in dic.items()]
    

    解释:for 循环遍历列表的所有元素。使用每个列表的第一个元素,我们检查 'dic' 是否将此名称作为键。如果是,我们添加到键的先前值,否则使用值“sample[1:]”创建键。最后一步将字典“dic”转换为所需的列表

    【讨论】:

      【解决方案4】:

      嗯...没有进口听起来像是功课。 Python 是关于重用的。但是,只是为了好玩:

      data = [['james', 100, 200, 300], ['james', 200, 300, 400], ['charles', 200, 200, 100]]
      
      
      def combine_lists(data, result=None):
          if result is None:
              result = []
          if data:
              return combine_lists(data[1:], _add_sublist(data[0], result))
          return result
      
      
      def _add_sublist(sublist, result):
          result_out = []
          combined = False
          for result_sublist in result:
              if sublist[0] == result_sublist[0]:
                  result_out.append([sublist[0], *[from_elt + into_elt
                                                   for from_elt, into_elt in zip(sublist[1:], result_sublist[1:])]])
                  combined = True
              else:
                  result_out.append(result_sublist)
          if not combined:
              result_out.append(sublist)
          return result_out
      

      使用您的数据在 shell 中运行函数:

      In [4]: combine_lists(data)                                                                                                                        
      Out[4]: [['james', 300, 500, 700], ['charles', 200, 200, 100]]
      

      在提交之前确保你理解代码:)

      【讨论】:

        猜你喜欢
        • 2021-08-17
        • 1970-01-01
        • 1970-01-01
        • 2021-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多