一个 "pythonic" 策略来检查一个键是否已经存在于字典中

A "pythonic" strategy to check whether a key already exists in a dictionary

我经常处理异构数据集,并在 python 例程中将它们作为字典获取。我经常遇到的问题是,我要添加到字典中的下一个条目的键已经存在。 我想知道是否存在更多 "pythonic" 方法来完成以下任务:检查键是否存在以及 create/update 我的字典中相应的键项对

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])]]

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

当你得到 KeyError

时,尝试抓住 Exception
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])]]

使用 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

这就是 dict.setdefault 的用途。

setdefault(key[, default])

If key is in the dictionary, return its value. If not, insert key with a value of default and return default. default defaults to None.

示例:

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

或使用:

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