如何对列表的元素进行分组?

How to group elements of a list?

我有一个列表列表。每个列表包含三个元素,称它们为 [number, letter, time]。它看起来像这样:

my_list = [[0, 'a', '0:00'],
           [1, 'a', '1:00'],
           [2, 'b', '2:00'],
           [3, 'c', '3:00'],
           [4, 'b', '4:00'],
           [5, 'a', '5:00'],
           [6, 'd', '6:00'],
           [7, 'c', '7:00'],
           [8, 'b', '8:00'],
           [9, 'e', '9:00']]

我想格式化此列表,使每个嵌套列表的 element[1]letter 成为新嵌套列表的 element[0],出现 numbertime 作为 element[1]element[2].

我想要的输出应该是这样的

my list = [['a', [0, 1, 5], ['0:00', '1:00', '5:00']],
           ['b', [2, 4, 8], ['2:00', '4:00', '8:00']],
           ['c', [3, 7], ['3:00', '7:00']],
           ['d', [6], ['6:00']],
           ['e', [9], ['9:00']]]

到目前为止我已经使用collections.Counter()得到了letter

的频率
>>> letter_count = Counter([element[1] for element in my_list])
>>> letter_count
Counter({'a': 3, 'b': 3, 'c': 2, 'd': 1, 'e': 1})

我相信我可以使用列表理解来完成剩下的事情,使用 letter_count.keys() 和条件,但我被卡住了。有什么建议吗?

此外,欢迎就更好、更具描述性的标题提出任何建议(为了后代)。

out = {}
for a, b, c in my_list:
    out.setdefault(b, []).append((a, c))

out = [[k, [i for i, _ in v], [i for _, i in v]]  for k, v in out.items()]

print(out)

打印:

[['a', [0, 1, 5], ['0:00', '1:00', '5:00']], 
 ['b', [2, 4, 8], ['2:00', '4:00', '8:00']], 
 ['c', [3, 7], ['3:00', '7:00']], 
 ['d', [6], ['6:00']], 
 ['e', [9], ['9:00']]]

另一种方法是使用itertools.groupby

import itertools

new_list = []
my_list = sorted(my_list, key=lambda row: row[1])
for name, groups in itertools.groupby(my_list, key=lambda row: row[1]):
    groups = list(zip(*groups))
    
    grouped_item = [name, groups[0], groups[2]]
    new_list.append(grouped_item)
    
print(new_list)
[['a', (0, 1, 5), ('0:00', '1:00', '5:00')],
 ['b', (2, 4, 8), ('2:00', '4:00', '8:00')],
 ['c', (3, 7), ('3:00', '7:00')],
 ['d', (6,), ('6:00',)],
 ['e', (9,), ('9:00',)]]

这是一个快速又脏的方法(与当前其他答案的效率相同,但代码更多)

my_list = [[0, 'a', '0:00'],
           [1, 'a', '1:00'],
           [2, 'b', '2:00'],
           [3, 'c', '3:00'],
           [4, 'b', '4:00'],
           [5, 'a', '5:00'],
           [6, 'd', '6:00'],
           [7, 'c', '7:00'],
           [8, 'b', '8:00'],
           [9, 'e', '9:00']]

tmp_dict = {}

for first, second, third in my_list:
    if second not in tmp_dict:
        tmp_dict[second] = [[],[]]

    tmp_dict[second][0].append(first)
    tmp_dict[second][1].append(third)

new_list = []

for key, val in tmp_dict.items():
    new_list.append([key] + val)

print(new_list)