Python CSV在哈希表中,然后计算总和
这是我的csv文件:Python CSV在哈希表中,然后计算总和,python,python-2.7,csv,hashtable,Python,Python 2.7,Csv,Hashtable,这是我的csv文件: name;value John;4.0 John;-15.0 John;1.0 John;-2.0 Bob;1.0 Bob;2.5 Bob;-8 我要打印此输出: John : 22 Bob : 11,5 22因为4+15+1+2=22 11,5,因为1+2,5+8=11,5 忽略-符号并用正号计算总数是很重要的 我试过这个: import csv with open('myfile.csv', 'rb') as f: reader = csv.reader(f
name;value
John;4.0
John;-15.0
John;1.0
John;-2.0
Bob;1.0
Bob;2.5
Bob;-8
我要打印此输出:
John : 22
Bob : 11,5
22因为4+15+1+2=22
11,5,因为1+2,5+8=11,5
忽略-
符号并用正号计算总数是很重要的
我试过这个:
import csv
with open('myfile.csv', 'rb') as f:
reader = csv.reader(f, delimiter=';')
for row in reader:
print row
Hashtable = {}
我知道我必须使用带有键值系统的哈希表,但我现在陷入了困境,请帮帮我,我使用的是python 2.7。假设
11,5
应该是11.5
,使用defaultdict
来处理重复的键,只需str.lstrip
任何减号和+=/code>每个值
import csv
from collections import defaultdict
d = defaultdict(float)
with open('test.txt', 'rb') as f:
reader = csv.reader(f, delimiter=';')
next(reader) # skip header
for name, val in reader:
d[name] += float(val.lstrip("-"))
输出:
for k,v in d.items():
print(k,v)
('Bob', 11.5)
('John', 22.0)
{'Bob': 11.5, 'John': 22.0}
如果出于某种原因想使用常规dict,可以使用dict.setdefault
:
d = {}
with open('test.txt', 'rb') as f:
reader = csv.reader(f, delimiter=';')
next(reader)
for name, val in reader:
d.setdefault(name, 0)
d[name] += float(val.lstrip("-"))
使用defauldict和lstrip是最有效的,一些时间安排:
In [26]: timeit default()
100 loops, best of 3: 2.6 ms per loop
In [27]: timeit counter()
100 loops, best of 3: 3.98 ms per loop
在本例中,我将使用Counter,它是一个围绕字典的标准库包装器,允许您轻松地计算元素
import csv
from collections import Counter
counter = Counter()
with open('myfile.csv', 'rb') as f:
reader = csv.reader(f, delimiter=';')
reader.next() #skips the heading
for row in reader:
counter[row[0]] += abs(float(row[1]))
现在,如果你真的需要使用香草字典,那么你只需要把你的计数逻辑膨胀一点,也就是说,代替
counter[row[0]] += abs(float(row[1]))
做
下面是如何调整代码以在末尾输出哈希:
import csv
out_hash = {}
with open('test.csv', 'rb') as f:
reader = csv.reader(f, delimiter=';')
reader.next() # Just to skip the header
for row in reader:
if row[0] in out_hash:
out_hash[row[0]] += abs(float(row[1]))
else:
out_hash[row[0]] = abs(float(row[1]))
print out_hash
输出:
for k,v in d.items():
print(k,v)
('Bob', 11.5)
('John', 22.0)
{'Bob': 11.5, 'John': 22.0}
创建等于零的john和bob变量,就像在第[0]='john':john+=abs(第[1]行)行中循环可以做的那样,您没有计数,而是在求和,因此使用计数器没有任何好处dict@PadraicCunningham当然我不知道defaultdict默认为0。所以总是使用计数器来丢失lambda。谢谢,我学到了一些新东西!与其说是defaultdict
默认为零,不如说是float()
默认为零。这很公平。愚蠢的我。我现在明白了。row[0]in-out\u hash.keys()
is和O(n)
操作,因此您使代码效率极低,这会挫败purpoe@PadraicCunningham.keys()肯定是错误的,但是更新后的代码仅通过哈希检查,而不是通过一个键数组检查,几乎是O(1)。为什么对reader:name中的行执行,val=行
而不是名称的,读取器中的val
?个人喜好?@jme,不是真的,我本来是在做别的事情,只是忽略了。