我经常处理异构数据集,并在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])]]
答案 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])]]
供参考:
答案 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])])