You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除嵌套列表中首元素重复的所有条目(含原项)

解决嵌套列表中移除首元素重复的所有条目问题

问题回顾

你给出的嵌套列表示例:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:23:12