嗨,我的名单如下: 例如:
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')
不应删除,因为它与任何其他元组都不匹配。
答案 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
。