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

Python字符串与列表操作:统计多列表中字符串的跨列表出现次数

嘿,我来帮你搞定这个统计字符串跨列表出现次数的问题!

首先得搞清楚你之前用remove()出错的原因:remove()会直接修改原列表,而且每次只删除第一个匹配的元素。如果同一个列表里有重复的字符串(比如["A", "A"]),用remove("A")后还剩一个"A",后续遍历可能会重复统计这个列表;另外,修改原列表会打乱遍历的索引,导致有些元素被跳过,最终统计结果肯定不准。

咱们的核心需求是:只要字符串在某个列表里出现过(不管出现多少次),这个列表就算“包含”它一次,最终统计每个字符串被多少个这样的列表包含。下面是几种靠谱的解法:

正确解法示例

假设你的5个列表是这样的:

list1 = ["A", "B", "C", "A"]  # 注意这里有重复的A
list2 = ["A", "C", "D"]
list3 = ["A", "B", "D"]
list4 = ["A", "C"]
list5 = ["B", "D", "D"]

方法1:用集合+字典手动统计

先把每个列表转成集合(自动去重,确保每个列表里的字符串只算一次),再逐个统计:

# 把所有列表转成集合,去除每个列表内的重复项
list_sets = [set(lst) for lst in [list1, list2, list3, list4, list5]]

# 收集所有出现过的字符串
all_unique_strings = set()
for s in list_sets:
    all_unique_strings.update(s)

# 统计每个字符串在多少个集合中存在
result = {}
for string in all_unique_strings:
    count = 0
    for s in list_sets:
        if string in s:
            count += 1
    result[string] = count

print(result)
# 输出: {'A': 4, 'B': 3, 'C': 3, 'D': 3}

方法2:用collections.defaultdict简化代码

这种方法更高效,不用先收集所有字符串:

from collections import defaultdict

list_sets = [set(lst) for lst in [list1, list2, list3, list4, list5]]
result = defaultdict(int)

# 遍历每个集合,给集合里的每个字符串计数+1
for s in list_sets:
    for string in s:
        result[string] += 1

print(dict(result))
# 得到和上面一样的正确结果

方法3:用collections.Counter一行搞定摊平统计

把所有集合的元素摊平成一个列表,直接用Counter计数:

from collections import Counter

list_sets = [set(lst) for lst in [list1, list2, list3, list4, list5]]
# 摊平所有集合的元素
flat_elements = [item for s in list_sets for item in s]
result = Counter(flat_elements)

print(dict(result))
# 结果完全一致

这些方法的核心都是先对单个列表去重,确保每个列表只贡献一次计数,然后再跨列表统计,完美避开了remove()带来的各种坑。

内容的提问来源于stack exchange,提问作者Erfan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:53:34