我当前正在编写代码,该代码应该读取包含近年来发生的大地震的日期和震级的文件,并返回字典,其中的键是地震发生的日期,然后是震级那天发生的地震
我的代码当前如下所示:
def magnitudedictionary():
earth = open("earthquakes.txt", "r")
magdict = {}
for line in earth:
alist = line.split()
magnitude= float(alist[0])
date = alist[1]
if date in magdict:
magdict[date].append(magnitude)
else:
magdict[date] = magnitude
earth.close()
return magdict
但是,每当我尝试运行代码时,我总会得到一条回溯,内容为:
Traceback (most recent call last):
File "/Users/MargaretJagger/PycharmProjects/Homework 6/Q2.py", line 18, in <module> magnitudedictionary()
File "/Users/MargaretJagger/PycharmProjects/Homework 6/Q2.py", line 10, in magnitudedictionary
magdict[date].append(magnitude)
AttributeError: 'float' object has no attribute 'append'
Process finished with exit code 1
我不太确定问题到底出在哪里,但是我知道这与float和字典值不匹配有关。
答案 0 :(得分:3)
您可能需要defaultDict。然后您可以避免测试,而只需输入值即可。
这是一个简单的模型:
from collections import defaultdict
earth = '''7.6 20190801
8.2 20180201
7.1 20190801
6.5 20190801
4.2 20180201'''
magdict = defaultdict(list) # values will default to new lists
for line in earth.split('\n'):
alist = line.split(' ')
magnitude= float(alist[0])
date = alist[1]
magdict[date].append(magnitude) #magdict[date] will default to a list if the key doesn't already exist
print(magdict['20190801'])
>>> [7.6, 7.1, 6.5]
答案 1 :(得分:1)
值是当天发生的地震的幅度。
由于您在谈论的是“量级”,即复数,因此我假设您希望能够在每个日期存储多个值。这意味着您还应确保字典值是存储多个值而不是单个值的实际列表。
比较以下示例词典:
{
"2019-04-17": 2.1,
"2019-04-18": 3.5
}
{
"2019-04-17": [1.7, 2.5],
"2019-04-18": [3.2]
}
第一个字典仅将日期映射到单个浮点数。因此,对于每个日期键,您将获得一个值。第二本字典映射到浮点列表。这样的列表只能包含一个值,也可以包含多个值(也可以不包含任何值)。
当您查看在字典中设置值的代码时,您会发现实际上是在考虑多个值的情况下构建的:
if date in magdict:
magdict[date].append(magnitude)
else:
magdict[date] = magnitude
如果字典中已经有日期,那么您想附加它。否则,您可以直接设置日期/值对(添加键)。就是这样,您要设置一个浮点值(即上面的第一个字典类型),而不是浮点列表。
因此,您需要做的是在此处创建一个浮动列表:
if date in magdict:
magdict[date].append(magnitude)
else:
magdict[date] = [magnitude]
[magnitude]
创建一个以magnitude
作为第一个值的单元素列表。由于字典中的值现在是一个列表,因此对append()
的调用将成功,并将正确的另一个值添加到列表中。
答案 2 :(得分:1)
错误在else子句中。
应该为magdict[date] = [magnitude]
,而不是magdict[date] = magnitude
。
答案 3 :(得分:1)
python字典有一个非常不错的方法setdefault
,在这里应该会有所帮助:
def magnitudedictionary():
earth = open("earthquakes.txt", "r")
magdict = {}
for line in earth:
alist = line.split()
magnitude= float(alist[0])
date = alist[1]
magdict.setdefault(date, []).append(magnitude)
earth.close()
return magdict
以下是有关该方法的一小部分文档:https://www.tutorialspoint.com/python/dictionary_setdefault.htm