gpt4 book ai didi

python - 按python中的第一个元素重新组合子列表

转载 作者:行者123 更新时间:2023-11-30 22:06:38 26 4
gpt4 key购买 nike

我有一个看起来像这样的嵌套列表:

first_list = [[a, 1], [b, 3], [a, 6], [a, 2], [b, 4], [b, 5], ...]

我想按第一个元素对它们进行分组,并创建一个新的嵌套列表,如下所示:

new_list = [ [1, 6, 2, ...], [3, 4, 5, ...], ...]

其中以 go 开头的所有元素都位于第一个子列表中,依此类推。不同值 a、b 等的数量在运行时之前是未知的,或者我可以这样做:

a_list = []
b_list = []
for tag, x in first_list:
if tag == a:
a_list.append(x)
elif tag == b:
b_list.append(x)
new_list = [a_list, b_list]

但是,我正在努力使其适应任意数量的标签。

我可能省略了问题的一个重要部分,但我应该说我已经有了一个“标签”列表,即:

tags = [a, b, c, d, ...]

它们实际上不是字符,因此缺少引号,但在任何情况下它们都应该是可散列的。

最佳答案

使用 Python 以及一般编程,您应该避免创建数量可变的变量。

默认字典

您可以使用list对象的defaultdict。这自然可以扩展到任意数量的组,而无需显式命名变量。

first_list = [['a', 1], ['b', 3], ['a', 6], ['a', 2], ['b', 4], ['b', 5]]

from collections import defaultdict

dd = defaultdict(list)

for cat, num in first_list:
dd[cat].append(num)

defaultdict(list, {'a': [1, 6, 2],
'b': [3, 4, 5]})

分组依据

defaultdict 解决方案的复杂度为 O(n),但是一个恰当命名的 itertools.groupby 解决方案是可能的,它需要排序和 O( n log n) 复杂度:

from itertools import groupby
from operator import itemgetter

sorter = sorted(first_list, key=itemgetter(0))
grouper = groupby(sorter, key=itemgetter(0))
res = {i: list(map(itemgetter(1), j)) for i, j in grouper}

{'a': [1, 6, 2], 'b': [3, 4, 5]}

列表输出列表

这就像在 dict.values 上调用 list 一样简单:

res_list = list(res.values())

关于python - 按python中的第一个元素重新组合子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52668645/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com