我想要做以下事情:我想输入"随机"顺序为1和0。 然后我想分析1的序列的这个序列,这样我就可以得到这些序列的长度和数量,最后得到的结果是:n中有n个链的x链。出现的所有长度n的序列。例如:
11011100011
- >有2个n = 2的链(' 11') 并且有1个n = 3的链(' 111')。
我可以通过计数功能实现吗?如果是这样,怎么样?如果没有,怎么回事? 我希望我的英语能够让你得到我的问题:)
答案 0 :(得分:0)
抱歉,我使用的是Python。
到目前为止我已经知道了,并且它正在发挥作用:
from collections import Counter
a = [1,0,0,1,1,0,1,0,0,1,1,1,0,0,1,0,0,1,0]
x=0
h=0
n_list=[]
for x in range (0,len(a)):
if (a[x]==1):
h=h+1
else:
if (h>0):
n_list.append(h)
h=0
x=x+1
print (n_list)
counts = Counter (n_list)
print (counts)
但是现在我想写这个: 10101010101010101010100作为字符串并转换为上面的列表。
(我想向某些人展示,即使你只是“随机”敲击键1和0,你也永远不会创建一个“真正的”随机数,因此如果他们不得不每两位数字之间用逗号表示)
另一个问题:列表末尾有一个零,我该怎么改变呢?
答案 1 :(得分:0)
这是需要长时间评论的简短代码。
import collections
import itertools
def count(seq):
# count the number of items in a sequence.
return sum(1 for _ in seq)
def count_things(input_string, what):
grouped = itertools.groupby(input_string)
counts = [count(subseq) for (key, subseq) in grouped if key == what]
return collections.Counter(counts)
现在尝试一下:
>>> one_counts = count_things('11100111101110110011', '1')
>>> print(one_counts)
Counter({2: 2, 3: 2, 4: 1})
有多少长度为3的序列?
>>> print one_counts[3]
2
如果我们需要,我们当然可以用它来计算:
>>> print(count_things('aaabbccaaabaa', 'a'))
Counter({3: 2, 2: 1})
这一切如何运作?
最奇怪的是groupby
. It takes a sequence and cuts it into a sequence of pairs。每对是(值,相同值的序列)。序列是生成器,而不是列表,但为了简单起见,我在这里将它们显示为列表:
itertools.groupby('110011100011') ->
[('1', ['1', '1']), ('0', ['0', '0']), ('1', ['1', '1', '1']), ('0', ['0', '0', '0']), ('1', ['1', '1'])]
需要count
函数来计算序列的长度。对于生成器,len
不起作用。我们可以使用len(list(...))
,但它会创建一个中间列表,在计算其项目后我们会丢弃它们。 Insted我选择生成1
s序列,源序列中的每个项目都有一个:(1 for _ in seq)
此处_
是有效的标识符;它通常代表“我不关心的价值”。
然后,使用list comprehension,我们将上面的对列表转换为长度列表,仅适用于包含'1'
s(或实际what
的序列等)。
现在Counter
takes a sequence of values and counts the numbers of occurrences of each。这是我们最终需要的。它的界面就像dict
一样,其中键是我们计算的东西,值是事物的数量。
看,没有循环,没有状态机,标准库做大多数事情。正如他们所说,包括电池。