首页 > 解决方案 > 如何仅匹配Python中以下值的计算总和

问题描述

我有这样一个输入文件,如何只匹配下一个ip值计算和范围值的总和并获得第一个ip值。

输入:

Code  Range   Ip
CN    5       16777210
CN    5       16777215
CN    5       16777220
AU    5       16778240
CN    2       16843776
CN    2       16843799

(这两个值代码 CN 相同)

但是 140(ip) 和 2(range) 140 + 2 = 142

所以计算下一个值 158 是不一样的所以如果计算匹配下一个 ip 值只有范围值的总和)

如果与下一个 IP 值的计算不匹配,则输出只需要原始值。

输出:(这个输出是正确的)

CN    15      16777210
AU    5       16778240
CN    2       16843776
CN    2       16843799

但是我的python代码得到了错误的输出并且它不正确,因为它都计算了匹配的代码

(另外,194000行的输入值无法正确读取,它不会输出所有值,在我的代码中读取文件很慢)

代码:

stack = []
file = "/Users/kiya/Desktop/input.txt"
with open(file, 'r') as f:
    for line in f:
        data = line.split()
        data[1] = int(data[1])
        if stack and data[0] == stack[-1][0]:
            stack[-1][1] += data[1]
        else:
            stack.append(data)

for i in stack:
    print("{0} {1} {2}".format(i[0],i[1],i[2]))

(这是错误的输出)

CN    15      16777210
AU    5       16778240
CN    4       16843776

标签: python

解决方案


将第三列转换为 int 并将条件更改为:

if stack and data[0] == stack[-1][0] and sum(stack[-1][1:3]) == data[2]: 

应该产生您正在寻找的结果:

lines = ["CN    5       16777210",
         "CN    5       16777215",
         "CN    5       16777220",
         "AU    5       16778240",
         "CN    2       16843776",
         "CN    2       16843799"]

stack = []
for line in lines: 
    data = [ col for col in line.split(" ") if col != "" ]
    data = [ data[0], int(data[1]), int(data[2]) ]
    if stack and data[0] == stack[-1][0] and sum(stack[-1][1:3]) == data[2]:
        stack[-1][1] += data[1]
    else:
        stack.append(data)

for item in stack:print(item)

['CN', 15, 16777210]
['AU', 5, 16778240]
['CN', 2, 16843776]
['CN', 2, 16843799]

推荐阅读