需要根据列表中元组的长度删除重复的元组

时间:2018-11-17 20:14:47

标签: python list tuples

嗨,我的名单如下: 例如:

l = [('b','a','c'),('a','c','d','f'),('a','y','f'),('b','a'),('a','c'), ('b','g')]

现在我只需要删除('b','a')元组,而不必删除('b','a','c')元组,同样地,也需要删除('a','c')元组如果长度== 2,则需要删除元组,并且它必须是重复的元组。

我需要输出为:

[('b','a','c'),('a','c','d','f'),('a','y','f'), ('b','g')]

这里('b','g')不应删除,因为它与任何其他元组都不匹配。

2 个答案:

答案 0 :(得分:1)

您可以使用以元组的前2个元素为键的字典来跟踪给定元组有多少个“重复项”。然后,您可以忽略最终结果中不唯一的2个元素元组:

l = [('32822', '32891'), ('32822', '32891', 'HRSNNJAQ-vMME-02', '10.88.163.113'), ('32891', '32781'), ('32781', '32822'), ('32781', '32822', 'EKRGMD92-vMME-01', '10.88.158.81', 'KSCYMOEC-MME-03', '10.148.9.19'), ('32781', '33033', 'KSCYMOEC-MME-03', '10.148.9.19'), ('32781', '33033'), ('32891', '33033'), ('32822', '33033')]

groups = {}
for t in l:
    k = t[:2]
    groups.setdefault(k, []).append(t)

result = [t for t in l if len(t) > 2 or len(groups[t]) == 1]

print(result)
# [('32822', '32891', 'HRSNNJAQ-vMME-02', '10.88.163.113'), ('32891', '32781'), ('32781', '32822', 'EKRGMD92-vMME-01', '10.88.158.81', 'KSCYMOEC-MME-03', '10.148.9.19'), ('32781', '33033', 'KSCYMOEC-MME-03', '10.148.9.19'), ('32891', '33033'), ('32822', '33033')]

答案 1 :(得分:0)

假设您只有一个最长的元组,而将较短的元组与列表中各项的子集放在一起:

l = [('b','a','c'),('a','c','d','f'),('a','y','f'),('b','a'),('a','c'), ('b','g')]
l = sorted(l, key = lambda x: len(x))

for idx,tup in enumerate(l):
    if any(all(i in t for i in tup) for t in l[idx+1:]):
        pass #do nothing
    else:
        print(tup) #print unique longest tuple

sort行,因此您将始终始终首先比较短的行,并且通过使用枚举和设置偏移量,您将始终与前面的较长的元组进行比较。 all将元组的每个子集与前面的子集进行比较,如果所有子集都位于更长的元组中,则不考虑其长度,any返回True