python - 如何仅匹配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
解决方案
将第三列转换为 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]
推荐阅读
- ldap - Spring security LDAP-错误 LDAP:错误代码 50-访问权限不足
- email - 如何强制 Google App Script MailApp.sendEmail 在循环中为每封电子邮件使用新线程?
- python - 编写一个接收字符串列表并返回列表列表的函数
- ruby-on-rails - 通过多对多保存嵌套属性时必须存在错误
- javascript - JS commonjs 导出函数显示为未定义
- java - Spring Boot 中多服务 bean 的设计模式
- bash - JetBrains Rider 使用 WSL 在 Windows 上的工作目录中添加新的 bash 终端
- c# - 数学 - 曲线优化、过滤、平滑
- python - 无法使用 python 请求 OSM 建筑物
- c# - $.connection.myHub.server.announce 客户端视图不起作用