我面临一个奇怪的问题,尽管多次尝试,但我无法找到问题的逻辑和正确的代码。
我有以下格式的文件:
aa:bb:cc dd:ee:ff 100 ---------->line1
aa:bb:cc dd:ee:ff 101 ---------->line2
dd:ee:ff aa:bb:cc 230 ---------->line3
dd:ee:ff aa:bb:cc 231 ---------->line4
dd:ee:ff aa:bb:cc 232 ---------->line5
aa:bb:cc dd:ee:ff 102 ---------->line6
aa:bb:cc dd:ee:ff 103 ---------->line7
aa:bb:cc dd:ee:ff 108 ---------->line8
dd:ee:ff aa:bb:cc 233 ---------->line9
gg:hh:ii jj:kk:ll 450 ---------->line10
jj:kk:ll gg:hh:ii 600 ---------->line11
我的程序应该逐行读取文件。在第一行和第二行中,相应的column1和column2值相等。第三列是序列号,对于任何两行都不相同 由于line1和line2相同,但它们的序列号仅相差1,我应首先读取这两行,并将它们的计数写为2作为输出文件。如果我们观察到,第6行和第7行与第1行和第2行相同,具有连续的序列号,但是具有不同的第1列和第2列条目的行号line3,line4,line5进入它们之间。因此,线(1和2)和线(6和7)不应全部组合在一起。因此,在输出文件中,我应该得到像2 3 2 1 1 1 1的结果。还有一点是,第7行和第8行的序列号大于1不同。因此,第8行应该被计为一个单独的条目虽然第6,7,8行具有相同的前两列,但不与第6和7行一起使用 我希望大多数人都能理解这个问题。如果没有,我会澄清有关问题的任何内容 如您所见,这是一个非常复杂的问题。我尝试使用字典,因为这是我所知道的唯一数据结构,但没有逻辑可行。请帮我解决这个问题。
答案 0 :(得分:1)
with open("abc") as f:
#read the first line and set the number from it as the value of `prev`
num, col4 = next(f).rsplit(None,2)[-2:] #use `str.rsplit` for minimum splits
prev = int(num)
col4_prev = col4
count = 1 #initialize `count` to 1
for lin in f:
num, col4 = lin.rsplit(None,2)[-2:]
num = int(num)
if num - prev == 1: #if current `num` - `prev` == 1
count+=1 # increment `count`
prev = num # set `prev` = `num`
else:
print count,col4_prev #else print `count` or write it to a file
count = 1 #reset `count` to 1
prev = num #set `prev` = `num`
col4_prev = col4
if num - prev != 1:
print count,col4
<强>输出:强>
2 400
3 600
2 400
1 111
1 500
1 999
1 888
'abc'包含:
aa:bb:cc dd:ee:ff 100 400
aa:bb:cc dd:ee:ff 101 400
dd:ee:ff aa:bb:cc 230 600
dd:ee:ff aa:bb:cc 231 600
dd:ee:ff aa:bb:cc 232 600
aa:bb:cc dd:ee:ff 102 400
aa:bb:cc dd:ee:ff 103 400
aa:bb:cc dd:ee:ff 108 111
dd:ee:ff aa:bb:cc 233 500
gg:hh:ii jj:kk:ll 450 999
jj:kk:ll gg:hh:ii 600 888
答案 1 :(得分:0)
from collections import defaultdict
results = defaultdict(int)
for line in open("input_file.txt", "r"):
columns = line.split(" ")
key = " ".join(columns[:2])
results[key] += 1
with output_file = open("output_file.txt", "w"):
for key, count in results:
output_file.write("{0} -> {1}".format(key, count))
答案 2 :(得分:0)
entries = open('filename.txt', 'r')
prevLine = ""
count = 1
for line in entries:
if line == prevLine:
count += 1
else:
print count
count = 1
prevLine = line
应该这样做,这是一个解释: 首先打开文件 然后你循环遍历文件的每一行 对于每一行,您将它与前一行进行比较 如果它与前一个相同,则在匹配计数器中添加一个 如果不相同,则打印输出并重置计数器 在循环结束时,您保存上一行
答案 3 :(得分:0)
您可以使用itertools.groupby()
...
from cStringIO import StringIO
import itertools
data = 'aa:bb:cc dd:ee:ff 100\n' \
'aa:bb:cc dd:ee:ff 101\n' \
'dd:ee:ff aa:bb:cc 230\n' \
'dd:ee:ff aa:bb:cc 231\n' \
'dd:ee:ff aa:bb:cc 232\n' \
'aa:bb:cc dd:ee:ff 102\n' \
'aa:bb:cc dd:ee:ff 103\n' \
'aa:bb:cc dd:ee:ff 108\n' \
'dd:ee:ff aa:bb:cc 233\n' \
'gg:hh:ii jj:kk:ll 450\n' \
'jj:kk:ll gg:hh:ii 600\n'
sio = StringIO(data)
print [len(list(g)) for k, g in itertools.groupby(sio, key=lambda x, c=itertools.count(): (x[:-5], int(x[-4:-1])-next(c)))]
...打印......
[2, 3, 2, 1, 1, 1, 1]