python - 我怎样才能在阅读 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)
解决方案
我认为 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
存储在内存中的字面顺序可能会改变。
推荐阅读
- javascript - 为什么当参数之一拒绝时 promise.race 不返回?
- c# - UnauthorizedAccessException,如何忽略并保持程序运行?
- python - 简单解释一下python unstack()
- sql-server - SQL让没有大前锋的球队
- python - 比较两列(在两个文件中),然后打印相似的行和不同的行
- java - 每当我尝试从我的 GUI 访问我的 sql 数据库时,我都会收到错误消息
- java - 如何验证一个字符串是否包含另一个字符串?
- windows - Apache Nifi windows 无法加载 NAR 库包
- python - python 文件写入问题,nerdtree 无法进行更改
- python - 如何识别某个图像何时消失