Python 如何筛选出与所需条件不匹配的字符串列表?

Python 如何筛选出与所需条件不匹配的字符串列表?,python,Python,我有几个包含字符串的元组,我想删除其中包含3个或更多相同元素的元组。所以我需要检查元组中是否有3个或更多的“A”、“B”、“C”或“D”。 我该怎么做呢?谢谢 ('A', 'A', 'A', 'A') <--remove because it has more than 3 'A's in it ('A', 'A', 'A', 'B') <--remove because it has 3 'A's in it ('B', 'B', 'B', 'B') <--remove be

我有几个包含字符串的元组,我想删除其中包含3个或更多相同元素的元组。所以我需要检查元组中是否有3个或更多的“A”、“B”、“C”或“D”。 我该怎么做呢?谢谢

('A', 'A', 'A', 'A') <--remove because it has more than 3 'A's in it
('A', 'A', 'A', 'B') <--remove because it has 3 'A's in it
('B', 'B', 'B', 'B') <--remove because it has more than 3 'B's in it
('B', 'B', 'B', 'C') <--remove because it has 3 'B's in it
('A', 'A', 'B', 'A') <--remove because it has 3 'A's in it
('A', 'A', 'B', 'B') <--this is ok
('A', 'A', 'B', 'C') <--this is ok
('A', 'A', 'B', 'D') <--this is ok
('A','A','A','A')可用于计算元素的出现次数:

from collections import Counter

data = [('A', 'A', 'A', 'A'),
        ('A', 'A', 'A', 'B'),
        ('B', 'B', 'B', 'B'),
        ('B', 'B', 'B', 'C'),
        ('A', 'A', 'B', 'A'),
        ('A', 'A', 'B', 'B'),
        ('A', 'A', 'B', 'C'),
        ('A', 'A', 'B', 'D')]


result = [t for t in data if all(value < 3 for value in Counter(t).values())]
print(result)
正如@coldspeed所提到的,您不需要测试所有值,只需要测试最大的值:

result = [t for t in data if max(Counter(t).values()) < 3]
result=[t表示最大值时数据中的t(计数器(t).values())<3]

编辑:此解决方案涉及额外的计算,并且在值方面效率低于
max
。避免。请参阅评论以获得精彩的讨论。
可以使用计数器,但使用计数器的方法可以避免检查计数器中的所有值。(编辑:然而,最常见的情况是,当传递参数时需要一个heapsort,这使得计算成本很高。感谢您在评论中指出它。)

从集合导入计数器
数据=[('A','A','A','A'),
(‘A’、‘A’、‘A’、‘B’),
(‘B’、‘B’、‘B’、‘B’),
(‘B’、‘B’、‘B’、‘C’),
(‘A’、‘A’、‘B’、‘A’),
(‘A’、‘A’、‘B’、‘B’),
(‘A’、‘A’、‘B’、‘C’),
(‘A’、‘A’、‘B’、‘D’)]
结果=[t表示计数器(t)中的t。最常见(1)[0][1]<3]
打印(结果)

无需测试所有值。您只能测试最大的一个

result = [i for i in data if max(Counter(i).values()) < 3]

这是元组列表吗?这些只是使用“itertools.product”生成的未命名元组。我可以将它们转换为元组列表或任何东西,您不需要测试所有的值,只需测试最大的值。当然,就复杂性而言,它是相同的,但不是干净的。@coldspeeddone。谢谢你的提示!非常感谢你。我以前试过“collections.Counter”,但语法错误。再次感谢你。你救了我几个小时的生命:)这是可行的,也很好,但我相信大多数常见的
需要对值进行排序,而其他的则需要线性扫描。哦,是吗?我假设计数器已经在创建时进行了排序/排序,但我不是100%确定。根据使用max更有效的文档,当指定n时,计数器对大多数情况使用堆:@DanielMesejo源代码似乎与您一致。如果删除此项,我会感到很遗憾,因为我发现这些注释非常有用。
from collections import Counter

data = [('A', 'A', 'A', 'A'),
        ('A', 'A', 'A', 'B'),
        ('B', 'B', 'B', 'B'),
        ('B', 'B', 'B', 'C'),
        ('A', 'A', 'B', 'A'),
        ('A', 'A', 'B', 'B'),
        ('A', 'A', 'B', 'C'),
        ('A', 'A', 'B', 'D')]


result = [t for t in data if Counter(t).most_common(1)[0][1] < 3]
print(result)
result = [i for i in data if max(Counter(i).values()) < 3]
[('A', 'A', 'B', 'B'), ('A', 'A', 'B', 'C'), ('A', 'A', 'B', 'D')]