【问题标题】:List of tuples into list of lists, with element grouping元组列表到列表列表中,带有元素分组
【发布时间】:2018-10-16 10:48:16
【问题描述】:

我有一个元组列表:

start_list = [(A99, 2, 3 B1), (A21, 3, 4, B1), (A123, 4, 5, B2), (A22, 3 6, B2), (A12, 4, 6, B1)]

我想将具有相同最后一个元素的所有元组分组到以下形式的列表中:

result = [[B1, [A99, A21, A12]],[B2, [A123, A22]]]

我的尝试:

for idx in range(len(start_list)):
        concat_list += [start_list[idx][0]]
        for idx2 in range(idx+1, len(start_list)):
            if start_list[idx][-1] == start_list[idx2][-1]:
                concat_list += [start_list[idx2][0]]

        grouped_list.append([start_list[idx][-1], concat_list])
        concat_list = []

    grouped_list = dict(((x[0]), x) for x in grouped_list).values()

它没有考虑所有元组,也没有将所有初始元素(A99,A123...)包含到相应的元组中。

【问题讨论】:

  • 什么是A99B1str 对象?
  • 它们可能是,在我的真实情况下它们是花车,但如果我将它们粘贴到这里,那将是一团糟。

标签: python python-3.x list dictionary nested


【解决方案1】:

您可以将collections.defaultdict 用于 O(n) 解决方案:

from collections import defaultdict

start_list = [('A99', 2, 3, 'B1'), ('A21', 3, 4, 'B1'), ('A123', 4, 5, 'B2'),
              ('A22', 3, 6, 'B2'), ('A12', 4, 6, 'B1')]

res = defaultdict(list)

for value, _, _, key in start_list:
    res[key].append(value)

结果:

defaultdict(list, {'B1': ['A99', 'A21', 'A12'],
                   'B2': ['A123', 'A22']})

如果您不介意tuple 元素,可以使用嵌套结构:

res_lst = list(res.items())

[('B1', ['A99', 'A21', 'A12']), ('B2', ['A123', 'A22'])]

或者对于您想要的精确输出,使用列表推导:

res_lst = [[k, v] for k, v in res.items()]

[['B1', ['A99', 'A21', 'A12']], ['B2', ['A123', 'A22']]]

【讨论】:

    【解决方案2】:

    你可以试试这样的:

    from collections import defaultdict
    
    d = defaultdict(lambda: [])
    start_list = [('A99', 2, 3, 'B1'), ('A21', 3, 4, 'B1'), ('A123', 4, 5, 'B2'), ('A22', 3, 6, 'B2'), ('A12', 4, 6, 'B1')]
    
    for elt in start_list:
        d[elt[3]].append(elt[0])
    
    grouped_list = [[k, v] for k, v in d.items()]
    

    【讨论】:

      猜你喜欢
      • 2014-04-27
      • 1970-01-01
      • 2016-12-19
      • 2012-07-26
      • 1970-01-01
      • 2017-04-11
      • 2012-10-31
      相关资源
      最近更新 更多