Max,len,拆分Python

时间:2016-10-05 09:50:34

标签: python itertools

我试图找到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)

1 个答案:

答案 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