Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python CSV在哈希表中,然后计算总和_Python_Python 2.7_Csv_Hashtable - Fatal编程技术网

Python 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

这是我的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, 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,不是真的,我本来是在做别的事情,只是忽略了。