在Python中合并列表项[重复]

Posted

技术标签:

【中文标题】在Python中合并列表项[重复]【英文标题】:Merging lists items in Python [duplicate] 【发布时间】:2012-04-13 02:09:13 【问题描述】:

可能重复:join list of lists in pythonFlatten (an irregular) list of lists in Python

所以,我需要使用 python 合并部分列表,但仍然无法获得有效的解决方案。 比如我有一个arr列表,我想得到

[
   [1, 2, (3, 4, 5, 6, 7, 8, 9, 11, 1)], 
   [5, 6, (7, 8, 9, 10, 1)]
] 

因此,它与 sql 查询“select * from table where smth=smth1”非常相似。不过,下面是我的代码,但效果不佳。

    arr = [[1, 2, 3, 4, 5, 6], [1, 2, 6, 7, 8, 9], [1, 2, 11, 1, 5, 9], [5, 6, 7, 8, 9, 10], [5, 6, 1, 1, 1, 1]]
    result = []
    for i in arr[:]:
        for j in arr[:]:
            if i[0] == j[0] and i[1] == j[1] and i != j:
                a = i[:]
                a[2:] = zip(i[2:], j[2:])
                result.append(a)

【问题讨论】:

这个问题已经回答了很多次了。 这到底是什么意思?很难理解...您要展平列表项吗?如果是这样,那么已经有很多这样的问题了。 @Closevoters:注意目标结构不寻常,他们想要的不仅仅是扁平化。 哦..嗯。这个问题很难理解,我建议你改写它,这样它就不会像重复了:) 哦,我想我明白了,他取每个列表的前两个元素,将它们作为列表中的前两个元素。然后他将列表的其余部分添加到一个元组中。他重复这一点,不添加重复的项目。然后他开始一个新列表,因为前两项已更改为 5,6。 【参考方案1】:

如果结果元组的顺序无关紧要,这是使用 itertools.groupby() 的一种解决方案

from itertools import groupby

arr = [[1, 2, 3, 4, 5, 6], [1, 2, 6, 7, 8, 9], [1, 2, 11, 1, 5, 9], [5, 6, 7, 8, 9, 10], [5, 6, 1, 1, 1, 1]]
arr.sort()
print [[group[0][0], group[0][1], tuple(set(sum([sublist[2:] for sublist in group[1]], [])))] for group in groupby(arr, lambda l: l[0:2])]

【讨论】:

【参考方案2】:
arr = [
    [1, 2, 3, 4, 5, 6], 
    [1, 2, 6, 7, 8, 9], 
    [1, 2, 11, 1, 5, 9], 
    [5, 6, 7, 8, 9, 10], 
    [5, 6, 1, 1, 1, 1]
]

data = 
for sub in arr:
    key = tuple(sub[:2])
    data[key] = data.get(key, set()).union(sub[2:])

print data

这会产生类似:

(1, 2): set([1, 3, 4, 5, 6, 7, 8, 9, 11]), (5, 6): set([8, 9, 10, 1, 7])

用这个来制作你的结构应该没有问题。

【讨论】:

以上是关于在Python中合并列表项[重复]的主要内容,如果未能解决你的问题,请参考以下文章

合并列表中的重复项? - 问题比看起来更复杂

Python3基础 列表之间+ 合并,不去除重复项

在合并包含列表时从包含列表的列表对象中删除重复项

在线性时间内将小的排序列表合并为更大的排序列表的算法,没有重复项

在 Dart 中合并两个对象列表

C# 合并重复列表项并将它们的第二个值求和(2D 对象列表)