Ответ 1
Вы можете использовать любой неизменяемый и хешируемый объект в качестве ключа, включая кортежи
number_of_read_lengths = {}
number_of_read_lengths[14,3] = "Your value"
Я хочу иметь возможность хранить и искать значения в словаре на основе двух целых значений.
Поэтому, когда я просматриваю значение, я хочу использовать клавиши read_length
и min_size
для доступа к элементу, например:
number_of_read_lengths[read_length][min_size]
Я знаю, что могу создавать вложенные словари, но это небольшая проблема.
Есть ли простой способ сделать то, что я хочу сделать?
Вы можете использовать любой неизменяемый и хешируемый объект в качестве ключа, включая кортежи
number_of_read_lengths = {}
number_of_read_lengths[14,3] = "Your value"
Вы можете попробовать использовать кортежи в качестве ключей:
number_of_read_lengths[(read_length, min_size)]
Использование кортежей может быть довольно раздражающим - вы должны помнить о размещении кортежа во время индексации.
Я бы порекомендовал вложенный dict, но a 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
Просто чтобы немного расширить комментарий, сделанный мной:
КлавишаA 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]
"""