如何移除嵌套列表中首元素重复的所有条目(含原项)
解决嵌套列表中移除首元素重复的所有条目问题
问题回顾
你给出的嵌套列表示例:
x = [["1.2.3.4","thing1"], ["8.8.8.8","thing2"], ["8.8.8.8","thing3"], ["8.8.4.4","thing4"]]
想要的结果是移除所有首元素重复的条目,最终只保留首元素唯一的项:
[["1.2.3.4","thing1"], ["8.8.4.4","thing4"]]
你尝试的代码:
print [a for a in x if x[0].count(a[0]) == 1]
只得到了 [['1.2.3.4', 'DNS']],显然没达到预期,下面来分析问题并给出正确解法。
问题出在哪?
你的代码里 x[0].count(a[0]) 是个关键错误——x[0] 指的是列表的第一个子元素(也就是 ["1.2.3.4","thing1"]),你在这个子列表里统计 a[0] 的出现次数,这完全不是你想要的统计范围。比如当遍历到 ["8.8.8.8","thing2"] 时,x[0] 里根本没有 "8.8.8.8",所以次数为0,自然不会被保留;只有 "1.2.3.4" 在 x[0] 里出现了1次,所以只有它被保留了。
正确解决方案
方法1:手动统计首元素出现次数
先遍历整个列表,统计每个首元素的出现次数,再过滤出次数为1的条目:
x = [["1.2.3.4","thing1"], ["8.8.8.8","thing2"], ["8.8.8.8","thing3"], ["8.8.4.4","thing4"]] # 第一步:统计每个首元素出现的次数 key_counts = {} for item in x: ip = item[0] # 如果ip不在字典里,默认计数0,加1后存入;否则直接加1 key_counts[ip] = key_counts.get(ip, 0) + 1 # 第二步:过滤出只出现过一次的条目 result = [item for item in x if key_counts[item[0]] == 1] print(result)
运行这段代码就能得到你想要的结果:
[['1.2.3.4', 'thing1'], ['8.8.4.4', 'thing4']]
方法2:用collections.Counter简化统计
Python标准库的Counter可以帮我们更简洁地完成统计工作,代码更紧凑:
from collections import Counter x = [["1.2.3.4","thing1"], ["8.8.8.8","thing2"], ["8.8.8.8","thing3"], ["8.8.4.4","thing4"]] # 提取所有首元素并统计次数 key_counts = Counter(item[0] for item in x) # 过滤出符合条件的条目 result = [item for item in x if key_counts[item[0]] == 1] print(result)
这个方法和方法1逻辑完全一致,只是用Counter替代了手动统计,写起来更高效。
内容的提问来源于stack exchange,提问作者Peter Volk
相关产品推荐
相关产品推荐

