有没有一种方法可以解决在Python中将float值附加到字典的问题?

时间:2019-04-17 23:10:16

标签: python python-3.x

我当前正在编写代码,该代码应该读取包含近年来发生的大地震的日期和震级的文件,并返回字典,其中的键是地震发生的日期,然后是震级那天发生的地震

我的代码当前如下所示:

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和字典值不匹配有关。

4 个答案:

答案 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