如何对列表的元素进行分组?
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]
,出现 number
和 time
作为 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)
我有一个列表列表。每个列表包含三个元素,称它们为 [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]
,出现 number
和 time
作为 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)