我希望能够根据两个整数值在字典中存储和查找值。
因此,当我查找一个值时,我想使用键read_length
并min_size
访问元素,如下所示:
number_of_read_lengths[read_length][min_size]
我知道我可以创建嵌套字典,但这有点麻烦。
有没有一种简单的方法可以做我想做的事情?
我希望能够根据两个整数值在字典中存储和查找值。
因此,当我查找一个值时,我想使用键read_length
并min_size
访问元素,如下所示:
number_of_read_lengths[read_length][min_size]
我知道我可以创建嵌套字典,但这有点麻烦。
有没有一种简单的方法可以做我想做的事情?
您可以使用任何不可变和可散列的对象作为键,包括元组
number_of_read_lengths = {}
number_of_read_lengths[14,3] = "Your value"
使用元组可能很烦人——你必须记住在索引期间放置元组。
我会推荐一个嵌套的字典,但是一个defaultdict
,像这样:
from collections import defaultdict
number_of_read_lengths = defaultdict(dict)
number_of_read_lengths[1][2] = 3
print(number_of_read_lengths)
此代码将给出:
defaultdict(<type 'dict'>, {1: {2: 3}})
这样,number_of_read_lengths
在访问或设置字典时,字典中任何不存在的元素都将被创建为字典。简单有效。
更多信息defaultdict
:http ://docs.python.org/library/collections.html#collections.defaultdict
还有例子:http ://docs.python.org/library/collections.html#defaultdict-examples
您可以尝试使用元组作为键:
number_of_read_lengths[(read_length, min_size)]
只是从我所做的评论中扩展一点:
dict
键必须是可散列的,这是一个简单的元组。但是,包含诸如列表之类的不可散列值的元组是不可散列的(即使它是不可变的!),因此不能用作dict
键:
>>> bad = ([12],[32])
# still immutable
>>> bad[1] = [21]
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
# but not hashable!
>>> d = {}
>>> d[bad] = 2
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: unhashable type: 'list'
您甚至可以将可变和可散列dict
的对象用作键,但这并不是真正有用,应该避免使用。
这是定义双索引字典的另一种方法。对我来说,更容易想象这个而不是其他方法。
dict_dict_v2 = {}
dict_dict_v2.setdefault(2, {})
dict_dict_v2.setdefault(3, {})
dict_dict_v2[2]['1.1.1.1'] = {}
dict_dict_v2[2]['1.0.1.0'] = {}
dict_dict_v2[3]['1.1.1.1'] = "double"
dict_dict_v2[3]['1.0.1.0'] = 12
dict_dict_v2[2]['1.1.1.1']['mac']=1111
dict_dict_v2[2]['1.1.1.1']['id']=1111
dict_dict_v2[2]['1.0.1.0']['id']=1010
print str(dict_dict_v2)
"""output:
{1: {'1.0.0.0': {'mac': 1010, 'id': 1000}, '1.1.1.1': {'mac': 1111}},
2: {'1.1.1.1': {'mac': 1111, 'id': 1111}, '1.0.1.0': {'id': 1010}},
3: {'1.1.1.1': 'double', '1.0.1.0': 12}}
"""
您可以使用以下 dict 基本功能:
print "len-> "+str(len(dict_dict_v2[2]))
print "keys-> "+str(dict_dict_v2[2].keys())
print "values-> "+str(dict_dict_v2[2].values())
"""output:
len-> 2
keys-> ['1.1.1.1', '1.0.1.0']
values-> [{'mac': 1111, 'id': 1111}, {'id': 1010}]
"""
print "len for 1.1.1.1-> "+str(len(dict_dict_v2[2]['1.1.1.1']))
print "keys for 1.1.1.1-> "+str(dict_dict_v2[2]['1.1.1.1'].keys())
print "values for 1.1.1.1-> "+str(dict_dict_v2[2]['1.1.1.1'].values())
"""output:
len for 1.1.1.1-> 2
keys for 1.1.1.1-> ['mac', 'id']
values for 1.1.1.1-> [1111, 1111]
"""