我试图找到A,B的所有组合重复3次。 一旦我完成了这个,我想通过分割字符串并返回len.max值来计算连续多少个A.然而,这对我来说很疯狂。我一定是误解了len(max(tmp.split =“A”)
任何人都可以解释这是真的吗(len返回字符串的长度,而max返回该字符串的最高整数,基于我的分割?)我希望它能够连续返回A的数量。即使有两个A,“A,B,A”也应该返回1。
欢迎提出建议和澄清
import itertools
list = list(itertools.product(["A", "B"], repeat=3))
count = 0;
for i in list:
count += 1;
tmp = str(i);
var = len(max(tmp.split("B")))
print(count, i, var)
答案 0 :(得分:3)
您可以使用itertools.groupby
在可迭代中查找相同元素的组。 groupby
生成一系列(key,group)元组,其中key
是组中元素的值,group
是该组的迭代器(它共享底层的可迭代)使用groupby
。要获得组的长度,我们需要将其转换为列表。
from itertools import product, groupby
for t in product("AB", repeat=3):
a = max([len(list(g)) for k, g in groupby(t) if k == "A"] or [0])
print(t, a)
<强>输出强>
('A', 'A', 'A') 3
('A', 'A', 'B') 2
('A', 'B', 'A') 1
('A', 'B', 'B') 1
('B', 'A', 'A') 2
('B', 'A', 'B') 1
('B', 'B', 'A') 1
('B', 'B', 'B') 0
我们需要将or [0]
附加到列表推导中以涵盖未找到“A”的情况,否则max
会抱怨我们正在尝试找到空序列的最大值。
Padraic Cunningham提醒我,{3}的Python 3版本接受一个默认的arg来处理当你传递一个空的iterable时的情况。他还展示了另一种计算迭代的长度的方法,因为它避免了将迭代捕获到列表中,所以它更快一点,消耗更少的RAM,这在处理大型迭代时非常方便。所以我们可以将上面的代码重写为
max