22

我希望能够根据两个整数值在字典中存储和查找值。

因此,当我查找一个值时,我想使用键read_lengthmin_size访问元素,如下所示:

number_of_read_lengths[read_length][min_size]

我知道我可以创建嵌套字典,但这有点麻烦。

有没有一种简单的方法可以做我想做的事情?

4

5 回答 5

38

您可以使用任何不可变和可散列的对象作为键,包括元组

number_of_read_lengths = {}

number_of_read_lengths[14,3] = "Your value"
于 2012-10-25T09:22:42.077 回答
4

使用元组可能很烦人——你必须记住在索引期间放置元组。

我会推荐一个嵌套的字典,但是一个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在访问或设置字典时,字典中任何不存在的元素都将被创建为字典。简单有效。

更多信息defaultdicthttp ://docs.python.org/library/collections.html#collections.defaultdict 还有例子:http ://docs.python.org/library/collections.html#defaultdict-examples

于 2012-10-25T09:34:06.650 回答
3

您可以尝试使用元组作为键:

number_of_read_lengths[(read_length, min_size)]
于 2012-10-25T09:23:25.653 回答
3

只是从我所做的评论中扩展一点:

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的对象用作键,但这并不是真正有用,应该避免使用。

于 2012-10-25T09:36:21.897 回答
0

这是定义双索引字典的另一种方法。对我来说,更容易想象这个而不是其他方法。

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]
"""
于 2015-08-04T16:53:54.203 回答