如何将子列表与匹配值分组

时间:2018-07-24 18:56:31

标签: python python-3.x

我有一个包含子列表的列表,并希望根据一个公共值对它们进行分组。

例如:

my_list = [["John", 1], ["Mark", 3], ["Peter", 5], ["Mark", 6], ["Mark", 33], ["John", 2]]

我想根据第一个值(名称)对它们进行分组。理想的结果将是:

grouped_list = [[["John", 1], ["John", 2]], [["Mark", 3], ["Mark", 6], ["Mark", 33]], [["Peter", 5]]] 

2 个答案:

答案 0 :(得分:4)

使用itertools.groupby

由于只希望按每个子列表的第一个元素分组,因此必须提供自定义键。

import itertools

[list(g) for _, g in itertools.groupby(sorted(my_list), lambda x: x[0])]

输出:

[[['John', 1], ['John', 2]],
 [['Mark', 3], ['Mark', 6], ['Mark', 33]],
 [['Peter', 5]]]

答案 1 :(得分:1)

好问题。我更喜欢@ user3483203使用itertools.groupby的答案,但这是没有导入的解决方案;

result = []
name_to_index = {}

for l in my_list:
    if l[0] in name_to_index:
        result[name_to_index.get(l[0])].append(l)
    else:
        result.append([l])
        name_to_index[l[0]] = len(result) - 1

输出:

[[['John', 1], ['John', 2]], [['Mark', 3], ['Mark', 6], ['Mark', 33]], [['Peter', 5]]]