gpt4 book ai didi

python - 合并具有共同元素值的列表而不对其进行排序

转载 作者:太空宇宙 更新时间:2023-11-04 09:37:07 26 4
gpt4 key购买 nike

我的问题是我有一个嵌套列表

l = [
['a','apple',1],
['b', 'banana', 0],
['a', 'artichoke', 'antenna'],
['b', 'brocolli', 'baton'],
['c', None, 22]
]

我想合并那些具有共同索引值的列表,而不对结果列表进行排序。我的首选输出:

[
['a','apple', 1, 'artichoke', 'antenna'],
['b', 'banana', 0, 'brocolli', 'baton'],
['c', None, 22]
]

我从 here 找到了解决方案和 here但是我得到的输出以某种方式排序,这是我当前的输出:

[['c', None, 22], [1, 'antenna', 'apple', 'artichoke', 'a'], [0, 'b', 'banana', 'brocolli', 'baton']]

我的代码如下:

len_l = len(l)
i = 0
while i < (len_l - 1):
for j in range(i + 1, len_l):

# i,j iterate over all pairs of l's elements including new
# elements from merged pairs. We use len_l because len(l)
# may change as we iterate
i_set = set(l[i])
j_set = set(l[j])
if len(i_set.intersection(j_set)) > 0:
# Remove these two from list
l.pop(j)
l.pop(i)

# Merge them and append to the orig. list
ij_union = list(i_set.union(j_set))
l.append(ij_union)


# len(l) has changed
len_l -= 1

# adjust 'i' because elements shifted
i -= 1

# abort inner loop, continue with next l[i]
break
i += 1
print(l)

我很感激这里的帮助,我也愿意接受关于如何以更简单的方式做到这一点的新建议,因为老实说,我没有使用 union()intersection () 方法之前。谢谢

最佳答案

您可以使用字典,每个列表的第一个元素作为键,每次在列表列表中遇到它们时扩展列表,例如:

data = [
['a','apple',1],
['b', 'banana', 0],
['a', 'artichoke', 'antenna'],
['b', 'brocolli', 'baton'],
['c', None, 22]
]

然后我们:

d = {} 
for k, *vals in data:
d.setdefault(k, []).extend(vals)

如果完全有必要保证键的顺序如列表中所示,您可以选择在这里使用 d = collections.OrderedDict()

它给你一个d:

{'a': ['apple', 1, 'artichoke', 'antenna'],
'b': ['banana', 0, 'brocolli', 'baton'],
'c': [None, 22]}

如果您随后想要解包为列表的列表(尽管作为 dict 可能更有用)那么您可以这样做:

new_data = [[k, *v] for k, v in d.items()]

得到:

[['a', 'apple', 1, 'artichoke', 'antenna'],
['b', 'banana', 0, 'brocolli', 'baton'],
['c', None, 22]]

关于python - 合并具有共同元素值的列表而不对其进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53240185/

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