识别事件并重现数字

时间:2014-02-27 12:57:28

标签: python

我有一个我想读的文字,看起来像

0;0;0
0;0;1# first time 1 appears-- |
0;1,2                         |one cycle for number one
0;1;2                         |
1;2;0 # last time 1 appears---|
2;3;4
0;0;0
0;1;2# second time 1 appears--|
0;1,2                         |second cycle for number one
0;1;2                         |
1;2;3 # last time 1 appears---|
2;3;4
...... so on

我说这个文件中的数字只在1到4之间。我应该忽略零。

我如何计算这样的循环次数,对于数字1或者每个使用python的数字?

2 个答案:

答案 0 :(得分:2)

我的代码:

string = """0;0;0
0;0;1
0;1,2
0;1;2
1;2;0
2;3;4
0;0;0
0;1;2
0;1,2
0;1;2
1;2;3
2;3;4"""
import itertools
num = '1'
print sum(i for i,_ in itertools.groupby(string.split('\n'), lambda x: num in x and 1 or 0))

答案 1 :(得分:2)

您的基本策略将如下:

  • 设置cycle_count = 0
  • read_until_contains_number()
  • read_until_does_not_contain_number()
  • 增量cycle_count
  • 重复直到不再输入

此代码将打印2代码1

input= """0;0;0
0;0;1
0;1;2
0;1;2
1;2;0
2;3;4
0;0;0
0;1;2
0;1;2
0;1;2
1;2;3
2;3;4"""
lines = input.split('\n')

def count_cycles(lines, n):
    cycles = 0
    inside = False
    for line in lines:
        print line
        numbers = map(int, line.split(';'))
        if inside:
           if not n in numbers:
                # end of cycle
                cycles += 1
                inside = False
        else:
            print 'not inside'
            if n in numbers:
                # new cycle
                inside = True
    return cycles

print count_cycles(1)

使用这样的if是非常糟糕的形式,因为当逻辑变得更复杂时,这将会崩溃。

由于你可能会对文件执行此操作,因此上面的基本策略可以像这样实现:

import StringIO
infile = StringIO.StringIO(input)

def count_cycles_in_file(f, n):
    cycles = 0
    while True:
        print 'in_count_cycles_in_file'
        try:
            read_until_start(f, n)
            read_until_end(f, n)
            cycles += 1
        except StopIteration:
            # EOF
            break
        print 'cycles:', cycles
    return cycles

def read_until_start(f, n):
    line = f.readline()
    while line:
        numbers = map(int, line.split(';'))
        if n in numbers:
            return
        line = f.readline()
    # EOF
    raise StopIteration()

def read_until_end(f, n):
    line = f.readline()
    while line:
        numbers = map(int, line.split(';'))
        if not n in numbers:
            return
        line = f.readline()
    # EOF
    raise StopIteration()