双索引字典

时间:2012-10-25 09:21:34

标签: python dictionary

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

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

number_of_read_lengths[read_length][min_size]

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

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

5 个答案:

答案 0 :(得分:25)

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

number_of_read_lengths = {}

number_of_read_lengths[14,3] = "Your value"

答案 1 :(得分:4)

使用元组可能会非常烦人 - 你必须记住在索引编制过程中放置​​元组。

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

有关defaultdict的更多信息:http://docs.python.org/library/collections.html#collections.defaultdict 还有一些示例:http://docs.python.org/library/collections.html#defaultdict-examples

答案 2 :(得分:3)

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

number_of_read_lengths[(read_length, min_size)]

答案 3 :(得分: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键,但它并没有用,应该避免使用。

答案 4 :(得分: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]
"""