0

我面临一个奇怪的问题,尽管尝试了很多次,但我无法找到问题的逻辑和正确的代码。

我有一个格式如下的文件:

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 行相同,具有连续的序列号,但行号 line3、line4、line5 具有不同的第 1 列和第 2 列条目。因此,行(1&2) 和行(6&7) 不应全部组合在一起。因此,在输出文件中,我应该得到类似 2 3 2 1 1 1 1 的结果。还有一件事是,第 7 行和第 8 行的序列号相差超过 1。因此,第 8 行应该算作一个单独的条目, 不与第 6 行和第 7 行一起,尽管第 6,7,8 行具有相同的前两列。
我希望大多数人都能理解这个问题。如果没有,我会澄清这个问题的任何事情。
如您所见,这是一个非常复杂的问题。我尝试使用字典,因为这是我知道的唯一数据结构,但没有任何逻辑有效。请帮我解决这个问题。

4

4 回答 4

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 
于 2013-06-25T19:30:05.913 回答
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]
于 2013-06-25T19:36:39.993 回答
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))
于 2013-06-25T19:30:35.490 回答
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

应该这样做,这里有一个解释:首先打开文件,然后循环遍历文件的每一行,将其与前一行进行比较,如果与前一行相同,则将其添加到匹配计数器如果不一样,则打印输出并在循环结束时重置计数器,然后保存上一行

于 2013-06-25T19:32:16.217 回答