删除作为这些元组列表中列表的重复组合的元组

时间:2018-08-26 03:50:25

标签: python python-3.x list duplicates tuples

我有清单

a = [([4, 7, 9], [3], 5.5), ([2, 5, 8], [3], 5.5), ([3], [4, 7, 9], 5.5), ([3], [2, 5, 8], 5.5)]

并且我正在尝试删除具有相同列表组合的重复元组。

例如,([4, 7, 9], [3], 5.5)([3], [4, 7, 9], 5.5)是相同的。因此,删除重复的元组后的输出将类似于:

a = [([4, 7, 9], [3], 5.5), ([2, 5, 8], [3], 5.5)]

允许以元组中的列表的任何顺序。

编辑(基于@DYZ的反馈):不允许完全展平的元组。例如,不允许(4,7,9,3,5.5)。输出仍应为以下形式:([list 1], [list2], constant)

我试图改编与Remove duplicated lists in list of lists in Python相关的方法,但是我陷入了精神僵局。

是否可以在链接的问题中进一步修改代码,或者有更有效的方法吗?

2 个答案:

答案 0 :(得分:2)

按a的元素的长度排序(将未列出的元素的长度设置为-1)。然后找到所得排序的唯一元素的索引,并使用这些索引来索引未排序的列表。

asort = [sorted(aa, key= lambda x: len(x) if isinstance(x,list) else -1) for aa in a]
inds = [i for i,x in enumerate(asort) if asort.index(x)==i]
a = [a[i] for i in inds]

答案 1 :(得分:1)

您可以为此工作使用字典。创建一个空字典:

from itertools import chain
d = {}

将每个元组及其展平形式分别作为值和键插入到字典中:

for t in a:
    # Flatten the tuple
    flat = chain.from_iterable(part if isinstance(part,list) else [part] 
                               for part in t)
    maps_to = frozenset(flat) # Sets cannot be used as keys
    d[maps_to] = t # Add it to the dict; the most recent addition "survives"

list(d.values())
#[([3], [4, 7, 9], 5.5), ([3], [2, 5, 8], 5.5)]