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
相关产品推荐
相关产品推荐

