动态计算文件条目的挑战性方法

时间:2013-06-25 19:20:37

标签: python

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

我有以下格式的文件:

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行一起使用 我希望大多数人都能理解这个问题。如果没有,我会澄清有关问题的任何内容 如您所见,这是一个非常复杂的问题。我尝试使用字典,因为这是我所知道的唯一数据结构,但没有逻辑可行。请帮我解决这个问题。

4 个答案:

答案 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]