Python 添加相似数组的值
主要目的是消除彼此相邻的类似数字(例如,在第一行中,如果它是Python 添加相似数组的值,python,arrays,Python,Arrays,主要目的是消除彼此相邻的类似数字(例如,在第一行中,如果它是T1000,8,8,则错误初始程序会消除它),但不幸的是,出现的问题是,有时csv文件包含上述行。我想分别讨论这些值。这里,第一行和第二行T1000,8,4相加后成为T1000,8,8,Error,然后被删除。类似地,最后3个值S5214,20,8,Error,S5214,20,4,Error和S5214,20,8,Error变为S5214,20,20,Error,然后被删除。我已经做了一段时间了,但我似乎无法理解它。非常感谢苏的帮助
T1000,8,8,则错误初始程序会消除它),但不幸的是,出现的问题是,有时csv文件包含上述行。我想分别讨论这些值。这里,第一行和第二行T1000,8,4
相加后成为T1000,8,8,Error
,然后被删除。类似地,最后3个值S5214,20,8,Error
,S5214,20,4,Error
和S5214,20,8,Error
变为S5214,20,20,Error
,然后被删除。我已经做了一段时间了,但我似乎无法理解它。非常感谢苏的帮助
with open('target.csv', 'r') as new:
yes = []
y = []
for line in new:
y.append(line)
print(line)
for n in range(0,len(y)-1):
x1 = int(y[n].split(',')[1]) + int(y[n+1].split(',')[1])
x2 = int(y[n].split(',')[2]) + int(y[n+1].split(',')[2])
y1 = int(y[n].split(',')[2])
y2 = int(y[n].split(',')[1])
y3 = int(y[n+1].split(',')[2])
y4 = int(y[n+1].split(',')[1])
if y[n].split(',')[0] == y[n+1].split(',')[0]:
if x1 == y1:
print(x2)
t = y[n].split(',')
t[1] = t[2]
y[n] = ",".join(t)
print(y[n])
elif x1 == y2:
print(x2)
t = y[n].split(',')
t[2] = t[1]
y[n] = ",".join(t)
print(y[n])
elif x2 == y1:
print(x2)
t = y[n].split(',')
t[1] = t[2]
y[n] = ",".join(t)
print(y[n])
elif x2 == y2:
print(x2)
t = y[n].split(',')
t[2] = t[1]
y[n] = ",".join(t)
print(y[n])
print(y)
elif x1 == y3:
print(x2)
t = y[n].split(',')
t[1] = t[2]
y[n] = ",".join(t)
print(y[n])
elif x1 == y4:
print(x2)
t = y[n].split(',')
t[2] = t[1]
y[n] = ",".join(t)
print(y[n])
elif x2 == y3:
print(x2)
t = y[n].split(',')
t[1] = t[2]
y[n] = ",".join(t)
print(y[n])
elif x2 == y4:
print(x2)
t = y[n].split(',')
t[2] = t[1]
y[n] = ",".join(t)
print(y[n])
我的csv文件如下所示:
T1000,8,4,Error
T1000,8,4,Error
S1234,2,4,Error
C1234,3,2,Error
S1348,4,2,Error
S5214,20,8,Error
S5214,20,4,Error
S5214,20,8,Error
首先,如果可以的话,应该避免在同一个上下文管理器中进行操作和读取。这使得代码更难阅读。(毕竟,扁平比嵌套好)
首先,一些设置:忽略此设置
inp='''
T1000,8,4,Error
T1000,8,4,Error
S1234,2,4,Error
C1234,3,2,Error
S1348,4,2,Error
S5214,20,8,Error
S5214,20,4,Error
S5214,20,8,Error
'''.strip().splitlines(True)
上面的这段代码应该为您提供输入字符串,类似于以下几行。对于您的情况,请使用以下选项
with open("target.txt","r") as f:
inp = f.readlines()
现在,您需要收集在开始处具有相似键的所有行,并对它们的值求和。我们可以为此使用defaultdict
from collections import defaultdict
temp = defaultdict(int) #this makes the default value 0.
现在,总结这些值。在这一步中,它还帮助将每行的第二个值存储在键本身中。根据此值,我们稍后将进行相等性检查
for line in inp:
k1, k2, v1, v2 = line.strip().split(',')
temp[k1, int(k2)] += int(v1)
#Output:
defaultdict(int,
{('T1000', 8): 8,
('S1234', 2): 4,
('C1234', 3): 2,
('S1348', 4): 2,
('S5214', 20): 20})
现在,获取和匹配的键名称。这些需要删除
to_remove = [k[0] for k, v in temp.items() if k[1] == v]
#Output:
['T1000', 'S5214']
最后,根据需要的输出编写一个条件。我想你希望其他线路保持不变
output = [line for line in inp if not any(line.startswith(s) for s in to_remove)]
#Output:
['S1234,2,4,Error\n', 'C1234,3,2,Error\n', 'S1348,4,2,Error\n']
然后,加入并写回一个文件
with open("output.txt", "w") as f:
f.write("".join(output))
没有读过这个问题,第一印象是第一位的。如果你的代码基本上看起来像是相同的4行的复制粘贴,有8次的微小差异,你需要重新审视你正在做的事情,看看你是否可以使用循环来代替。你的预期输出是什么还不是很清楚。在本说明中:T1000,8,4相加后成为T1000,8,8,然后删除错误,
删除的是什么?原始版本和汇总版本,两者都有。如果您添加了最终的预期结果,将会有所帮助。很抱歉,我没有说清楚!第一行和第二行中的结束数字值4相加为8,从而创建值T1000,8,8
,这意味着我不再需要该值。与底部3相同,其中8,4和8相加为20,使最终值S5214,20,20
,然后将其从文本文件中删除,因此只剩下S1234,2,4,Error
,C1234,3,2,Error
和S1348,4,2,Error
非常感谢Paritosh!嗯,我是一个自学成才的程序员,通过反复试验来让很多事情正常工作。我学会了使用代码。我想知道如何使用真正有效的方法,像上面提到的那样,像程序员一样思考。你推荐什么资源吗?@AbidAbdulGafoor不用担心,这里也是自学成才的。对我来说,最大的信息来源就是stackoverflow本身。对您有帮助的最大的事情之一是确保您了解如何使用提供的所有基本数据类型。哈希表(或python中的dict)和集合为涉及查找的操作提供了一些真正强大的加速。如果您正在寻找一些东西作为编程概述,我可以推荐。然而,要记住的主要事情是不断学习,所以这很好。