A" pythonic"检查密钥是否已存在于字典中的策略

时间:2015-03-31 08:46:22

标签: python dictionary key

我经常处理异构数据集,并在python例程中将它们作为字典获取。我通常面临的问题是,我要添加到字典中的下一个条目的键已经存在。 我想知道是否存在更多" pythonic"执行以下任务的方法:检查密钥是否存在,并创建/更新我的字典对应的对键项

myDict = dict()
for line in myDatasetFile:
   if int(line[-1]) in myDict.keys():
        myDict[int(line[-1])].append([line[2],float(line[3])])
   else:
        myDict[int(line[-1])] = [[line[2],float(line[3])]]

5 个答案:

答案 0 :(得分:7)

使用defaultdict

from collections import defaultdict

d = defaultdict(list)

# Every time you try to access the value of a key that isn't in the dict yet,
# d will call list with no arguments (producing an empty list),
# store the result as the new value, and give you that.

for line in myDatasetFile:
    d[int(line[-1])].append([line[2],float(line[3])])

此外,从不使用thing in d.keys()。在Python 2中,这将创建一个键列表,并一次迭代一个项以查找键而不是使用基于散列的查找。在Python 3中,它并不是那么可怕,但它仍然是多余的,并且仍然比正确的方式慢,thing in d

答案 1 :(得分:3)

它是dict.setdefault的用途。

  

setdefault(key[, default])

     

如果键在词典中,则返回其值。如果不是,请插入值为default的值并返回default。默认默认为无。

示例:

>>> d={}
>>> d.setdefault('a',[]).append([1,2])
>>> d
{'a': [[1, 2]]}

答案 2 :(得分:1)

Python遵循这样的想法,即请求宽恕比允许更容易。

所以真正的Pythonic方式是:

try:
    myDict[int(line[-1])].append([line[2],float(line[3])])
except KeyError:
    myDict[int(line[-1])] = [[line[2],float(line[3])]]

供参考:

https://docs.python.org/2/glossary.html#term-eafp

https://stackoverflow.com/questions/6092992/why-is-it-easier-to-ask-forgiveness-than-permission-in-python-but-not-in-java

答案 3 :(得分:0)

当您获得Exception

时,尝试抓住KeyError
myDict = dict()
for line in myDatasetFile:
   try:
        myDict[int(line[-1])].append([line[2],float(line[3])])
   except KeyError:
        myDict[int(line[-1])] = [[line[2],float(line[3])]]

答案 4 :(得分:-1)

或使用:

myDict = dict()
for line in myDatasetFile:
   myDict.setdefault(int(line[-1]),[]).append([line[2],float(line[3])])