(使用Python 2.7)列表,例如:
L = [
{'ID': 1, 'val': ['eggs']},
{'ID': 2, 'val': ['bacon']},
{'ID': 6, 'val': ['sausage']},
{'ID': 9, 'val': ['spam']}
]
这就是我想要的:
def getdict(list, dict_ID):
for rec in list
if rec['ID'] == dict_ID:
return rec
print getdict(L, 6)
但是有没有办法直接解决该词典,而不会在列表上进行迭代直到找到它?
用例:读取记录文件(有序的dicts)。来自具有重新出现ID的记录的不同键值必须与具有该ID的第一次出现的记录合并。
ID号可能出现在其他键值中,因此if rec['ID'] in list
会产生误报。
在阅读记录(并将它们添加到有序词典列表中)时,我保留了一组唯一ID,如果新读取的ID已经存在,则只调用getdict
。但是,它仍然是很多迭代,我想知道是否有更好的方法。
答案 0 :(得分:2)
用例:读取记录文件(有序的dicts)。不同的关键 来自具有重新出现ID的记录中的值必须与 记录第一次出现该ID。
您需要使用defaultdict
:
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d['a'].append(1)
>>> d['a'].append(2)
>>> d['b'].append(3)
>>> d['c'].append(4)
>>> d['b'].append(5)
>>> print(d['a'])
[1, 2]
>>> print(d)
defaultdict(<type 'list'>, {'a': [1, 2], 'c': [4], 'b': [3, 5]})
如果要存储其他对象(例如字典),只需将其作为可调用对象传递:
>>> d = defaultdict(dict)
>>> d['a']['values'] = []
>>> d['b']['values'] = []
>>> d['a']['values'].append('a')
>>> d['a']['values'].append('b')
>>> print(d)
defaultdict(<type 'dict'>, {'a': {'values': ['a', 'b']}, 'b': {'values': []}})
答案 1 :(得分:1)
也许我错过了一些东西,但你不能使用一本字典吗?
L = {
1 : 'eggs',
2 : 'bacon',
6 : 'sausage',
9 : 'spam'
}
然后你可以L.get(ID)
。如果ID不在dict中,这将返回值(egg等)或None
。
答案 2 :(得分:0)
您似乎正在进行反向字典查找,即按值而不是按键查找。 Inverse dictionary lookup - Python有一些关于如何有效地做到这一点的指示。