我有一个我想读的文字,看起来像
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的数字?
答案 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()