我想做的是找出从用户输入中读取的列表中有多少个“ 1”序列。例如,如果我的列表如下所示:
mylist = [0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1]
,然后我要打印“ 3”,因为我有3个序列,分别为1。
到目前为止,我已经尝试找到索引“ 0”并查看这些索引是否连续(这意味着在我的2个零之间是1的序列,但是没有成功。
答案 0 :(得分:6)
您可以在itertools.groupby
的生成器表达式中使用sum
:
from itertools import groupby
sum(1 for k, _ in groupby(mylist) if k)
这将返回:3
答案 1 :(得分:2)
如果您知道列表将仅由1和0组成,则可以将所有内容作为一个字符串连接在一起,在每次出现“ 0”时将其拆分,然后计算所有的1s(不为空的任何部分)。
>>> mylist = [0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1]
>>> chunks_o_ones = [i for i in ''.join([str(i) for i in mylist]).split('0') if len(i) > 0]
>>> print(len(chunks_o_ones))
3
您也可以选择字符串并使用正则表达式查找“ 1”块:
>>> import re
>>> p = re.compile('1+')
>>> print(len(p.findall(''.join([str(i) for i in mylist]))))
3
答案 2 :(得分:1)
您可以将diff应用于列表,这基本上是
diff_list = []
for i in range(len(list)-1):
diff_list[i] = list[i+1]-list[i]
如果从0到1的变化将为您提供1,如果没有变化则为0,如果从1变为0则为-1。然后,您可以使用
nones = diff_list.count(1)
计算从0到1过渡的次数。尽管它不会计算第一个序列,但是如果列表的第一个元素是一个,则可以进行以下调整:
if list[0] == 1:
nones += 1
答案 3 :(得分:1)
从后续元素中减去数组的每个元素。每当从0-> 1发生变化时,该差将为1。只要我们具有1的差,则意味着新的1s模式已经开始。最后将它们加起来。
mylist = [0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1]
sum([ 1 if (mylist[i+1] - mylist[i])==1 else 0 for i in range(len(mylist)-1)]+[1 if mylist[0]==1 else 0])
3