Estoy haciendo esta cosa de centralita en Python donde necesito hacer un seguimiento de quién está hablando con quién, así que si Alice -> Bob, eso implica que Bob -> Alice.
Sí, podría completar dos mapas hash, pero me pregunto si alguien tiene una idea para hacerlo con uno.
O sugiera otra estructura de datos.
No hay múltiples conversaciones. Digamos que esto es para un centro de llamadas de servicio al cliente, por lo que cuando Alice marca en la centralita, solo va a hablar con Bob. Sus respuestas también van solo para ella.
Respuestas:
Puede crear su propio tipo de diccionario subclasificando
dict
y agregando la lógica que desee. Aquí tienes un ejemplo básico:Y funciona así:
Estoy seguro de que no cubrí todos los casos, pero eso debería ayudarlo a comenzar.
fuente
.add
método para que puedas hacer cosas como end.add('Bob', 'Alice')
lugar de usar la sintaxis que mostré. También incluiría algún manejo de errores. Pero entiendes la idea básica. :)d['foo'] = 'baz'
sería necesario eliminar labar
clave).dict
produce un comportamiento engañoso aquí, porque si crea el objeto con algún contenido inicial, la estructura se romperá.__init__
debe anularse para permitir que una construcción similard = TwoWayDict({'foo' : 'bar'})
funcione correctamente.pip install bidict
. URL: pypi.python.org/pypi/bidictEn su caso especial, puede almacenar ambos en un diccionario:
Dado que lo que está describiendo es una relación simétrica.
A -> B => B -> A
fuente
Sé que es una pregunta anterior, pero quería mencionar otra gran solución a este problema, a saber, el paquete bidict de Python . Es extremadamente sencillo de usar:
fuente
Solo rellenaría un segundo hash, con
fuente
reverse_map = dict(reversed(item) for item in forward_map.items())
my_dict.update(dict(reversed(item) for item in my_dict.items()))
Unexpected type(s): (Generator[Iterator[Union[str, Any]], Any, None]) Possible types: (Mapping) (Iterable[Tuple[Any, Any]])
. ¿Alguna idea de cómo deshacerse de la advertencia?En realidad, dos mapas hash es probablemente la solución de rendimiento más rápido, suponiendo que pueda ahorrar memoria. Los envolvería en una sola clase: la carga del programador es asegurarse de que dos mapas hash se sincronicen correctamente.
fuente
mydict[:value]
para obtenerkey
(a costa de algo de rendimiento)Tienes dos problemas distintos.
Tienes un objeto "Conversación". Se refiere a dos personas. Dado que una persona puede tener varias conversaciones, tienes una relación de varios a varios.
Tiene un mapa de persona a una lista de conversaciones. Una conversión tendrá un par de personas.
Haz algo como esto
fuente
No, realmente no hay forma de hacer esto sin crear dos diccionarios. ¿Cómo sería posible implementar esto con un solo diccionario sin dejar de ofrecer un rendimiento comparable?
Es mejor crear un tipo personalizado que encapsule dos diccionarios y exponga la funcionalidad que desea.
fuente
Una forma menos detallada, todavía usando invertida:
fuente
Es posible que pueda usar un
DoubleDict
como se muestra en la receta 578224 del Python Cookbook .fuente
Otra posible solución es implementar una subclase de
dict
, que contiene el diccionario original y realiza un seguimiento de una versión inversa del mismo. Mantener dos dictados separados puede resultar útil si las claves y los valores se superponen.Ejemplo:
fuente
Existe la biblioteca de colecciones extendidas en pypi: https://pypi.python.org/pypi/collections-extended/0.6.0
Usar la clase de biyección es tan fácil como:
fuente
Me gusta la sugerencia de bidict en uno de los comentarios.
pip install bidict
Uso:
Dado que no hay muchos documentos al respecto. Pero tengo todas las características que necesito para que funcionen correctamente.
Huellas dactilares:
fuente
El módulo de extensión kjbuckets C proporciona una estructura de datos de "gráfico" que creo que le da lo que desea.
fuente
Aquí hay una implementación más de diccionario bidireccional al extender la
dict
clase de pitones en caso de que no le guste ninguno de los otros:Úselo como un diccionario de Python normal, excepto en la construcción:
fuente
Una forma en la que me gusta hacer este tipo de cosas es algo como:
fuente