Я поддерживаю словарь, который отслеживает сходство между парами объектов.
Например, этот словарь может выглядеть следующим образом:Композитные клавиши в словарях
similarities = {
p1: {p2: v12, p3:v13, p4:v14},
p2: {p1: v21, p3:v23, p4:v24},
p3: {p1: v31, p2:v32, p4:v34},
p4: {p1: v41, p2:v42, p4:v43}
}
Заметим, что измерение подобия является симметричным. Следовательно, similarities[p1][p2]
является таким же, как similarities[p2][p1]
, то есть v12 == v21
.
Иногда мне необходимо устранить p2
от similarities[p1]
; и при этом мне нужно будет удалить p1
и p2
со всех внутренних словарей в similarities
.
Это утомительно и неэффективно.
Таким образом, вместо того, чтобы поддерживать симметричный словарь, существует ли способ поддерживать словарь с составным ключом, чтобы я мог искать similarities[p1,p2]
?
Я не могу использовать tuple
с (p1, p2) != (p2, p1)
и не знаю априори, как заказать кортеж.
frozenset
единственный другой контейнер, который я могу думать, но это не будет сокращать его, так как там может быть и другие ключи в similarities
, которые содержат либо p1
или p2
в качестве компонента. Итак, какой контейнер я мог использовать для решения этой проблемы?
Техническая информация:
- питона 2,7
- всегда будет ровно два элемента в этой "составной ключ"
Спасибо
'frozenset' кажется, что это позволит решить проблему для меня - Любая причина думать, что там может быть что-то лучше ? – mgilson
Можете ли вы использовать синтаксис, подобный «сходствам [p1, p2]»? – Blender
@Blender: нет, это незаконный синтаксис и в лучшем случае может быть переведен в кортеж – inspectorG4dget