La recuperación de una tupla de una colección de tuplas basado en un valor contenido

StackOverflow https://stackoverflow.com/questions/1047403

  •  20-08-2019
  •  | 
  •  

Pregunta

Tengo una estructura de datos es un conjunto de tuplas como este:

things = ( (123, 1, "Floogle"), (154, 33, "Blurgle"), (156, 55, "Blarg") )

El primer y tercer elementos son únicos a la colección.

Lo que quiero hacer es obtener un determinado tupla por refiriéndose al tercer valor, por ejemplo:

>>> my_thing = things.get( value(3) == "Blurgle" )
(154, 33, "Blurgle")

Debe haber una mejor manera de escribir un bucle para comprobar cada uno de los valores uno por uno!

¿Fue útil?

Solución

Si things es una lista, y usted sabe que el tercer elemento es la únicas, lo que acerca de una lista de comprensión?

>> my_thing = [x for x in things if x[2]=="Blurgle"][0]

Aunque bajo el capó, supongo que pasa a través de todos los valores y cheques de ellos de forma individual.Si no te gusta eso, ¿qué acerca de cómo cambiar la my_things estructura, de modo que una dict y usando ya sea el primer o el tercer valor de la clave?

Otros consejos

Un bucle (o algo equivalente al 100% como una lista por comprensión o genexp) es realmente el único enfoque si su estructura a nivel externo es una tupla, como usted indica - tuplas son, por diseño deliberado, un peso extremadamente ligero contenedor, sin apenas métodos de hecho. (sólo los pocos métodos especiales que se necesitan para implementar la indexación, bucles y similares; -)

Recuperación velocidad del rayo es una característica de los diccionarios, no tuplas. ¿No puedes tener un diccionario (como la estructura principal, o como auxiliar de lado uno) "valor del tercer elemento" mapeo a la subtuple usted busca (o su índice en la tupla principal, tal vez)? Eso podría ser construido con un solo lazo y luego entregar la mayor cantidad de búsquedas rápidas a medida que se preocupan de tener!

Si decide bucle, un genexp según el comentario de Brian una respuesta a mi es tanto más legible y, en promedio, tal vez dos veces más rápido que un listcomp (ya que sólo hace la mitad del bucle):

my_thing = next(item for item in things if item[2] == "Blurgle")

que se lee sin problemas como "el siguiente elemento de cosas cuya [2] subtema Equale Blurgle" (como usted está comenzando desde el principio el tema "junto" a encontrar va a ser el "primero" - y, en su caso, sólo -. uno adecuado)

Si necesita cubrir el caso en el que no hay ningún elemento satisface el predicado, puede pasar next un segundo argumento (que se devolverá si es necesario), de lo contrario (sin segundo argumento, como en mi fragmento) que' ll obtener una excepción StopIteration si no hay ningún elemento satisface el predicado - ya sea el comportamiento puede ser lo que desee (como dice el caso nunca se presenta, una excepción parece adecuado para su aplicación en particular, desde que se produjo en cuestión sería un error inesperado) .

Si usted tiene que hacer este tipo de búsqueda varias veces, ¿por qué no convertir las cosas a things_dict una vez, entonces será fácil y más rápido para buscar más adelante

things = ( (123, 1, "Floogle"), (154, 33, "Blurgle"), (156, 55, "Blarg") )

things_dict = {}
for t in things:
    things_dict[t[2]] = t

print things_dict['Blarg']
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top