首页 > 解决方案 > 我怎样才能在阅读 csv 文件的字典中获得更多解决方案?

问题描述

我正在从零开始学习 python,并找到一个关于在 csv 文件中读取余额的练习。在这段代码中,运行正确,我从该业务的最后余额中得到一个比率,但现在我想知道过去 2 年的余额,而不仅仅是去年,如果输入“print(screener[0: 2])我收到以下错误:“unhashable type: 'slice'” 我怎样才能获得该比率的最后 2 年?谢谢

import csv

data = csv.reader(open("d:\\downloads\\balances.csv"), delimiter = ";")
        
balances = [fila for fila in data]

businesses = ["AAPL", "AMZN","FB","TSLA","KO","NFLX"]

calculate = {}

for business in businesses:

    calculate[business]=False
    
screener ={}

for balance in balances:

    business=balance[0]

    if business in businesses and balance[1]=="anual" and calculate[business]==False:

        try:
            screener[business]=round(int(balance[16])/int(balance[13]),2)
        except:
            screener[business]="couldnt calculate"
        finally:
            calculate[business]=True
print(screener)

标签: pythoncsvdictionary

解决方案


我认为 WNG 已经在帮助您修改代码以获得所需的余额方面处于领先地位。我想在您的帖子中回答另一个(隐含的)问题:为什么不起作用screener[0:2]

字典的唯一有效键是不可变类型。因此,元组(0,1,2)是有效的字典键,但列表[0,1,2]不是。在不可变对象中包装可变类型也不起作用:

>>> X = ([1,2], [3,4])
>>> d = {}
>>> d[X] = "a"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> Y = ((1,2), (3,4))
>>> d[Y] = "a"
>>> d
{((1, 2), (3, 4)): 'a'}

我不确定切片是可变的还是不可变的,或者它们是否具有此属性。我刚刚了解到迭代器是可散列的:

>>> ten = range(10)
>>> d[ten] = "x"
>>> d
{((1, 2), (3, 4)): 'a', range(0, 10): 'x'}

最后一点,字典元素没有顺序:因为screener是字典,所以您不应该认为元素以任何特定顺序存在;它们只能通过它们的键访问,例如screener["AAPL"]是有效的,并且screener[0] 可能是有效的,因为int它是不可变类型,但它不必是字典的“第一个”元素,它只是另一个键。Python 处理如何将数据存储在字典中,并重新排序元素以实现高效的(不折不扣的)常量访问时间。当然,计算机内存是有顺序的,因为所有东西都有一个内存地址并且这些地址顺序增加,但是如果你运行你的代码两次,元素screener存储在内存中的字面顺序可能会改变。


推荐阅读