Tengo una lista como la siguiente, donde el primer elemento es la identificación y el otro es una cadena:
[(1, u'abc'), (2, u'def')]
Quiero crear una lista de identificadores solo a partir de esta lista de tuplas de la siguiente manera:
[1,2]
Usaré esta lista, por __in
lo que debe ser una lista de valores enteros.
¿Te refieres a algo como esto?
Lo que realmente tiene es una lista de
tuple
objetos, no una lista de conjuntos (como su pregunta original implicaba). Si en realidad es una lista de conjuntos, entonces no hay un primer elemento porque los conjuntos no tienen orden.Aquí he creado una lista plana porque generalmente eso parece más útil que crear una lista de tuplas de 1 elemento. Sin embargo, puede crear fácilmente una lista de tuplas de 1 elemento simplemente reemplazándolas
seq[0]
por(seq[0],)
.fuente
int() argument must be a string or a number, not 'QuerySet'
int()
no está en ninguna parte de mi solución, por lo que la excepción que está viendo debe venir más adelante en el código.__in
para filtrar datos__in
? - Según el ejemplo de entrada que ha proporcionado, esto creará una lista de enteros. Sin embargo, si su lista de tuplas no comienza con números enteros, entonces no obtendrá números enteros y deberá convertirlos en números enterosint
, o tratar de descubrir por qué su primer elemento no puede convertirse en un número entero.new_list = [ seq[0] for seq in yourlist if type(seq[0]) == int]
?Puede usar "desempaquetar tuplas":
En el momento de la iteración, cada tupla se desempaqueta y sus valores se establecen en las variables
idx
yval
.fuente
Esto es para lo que
operator.itemgetter
sirve.La
itemgetter
instrucción devuelve una función que devuelve el índice del elemento que especifique. Es exactamente lo mismo que escribirPero creo que
itemgetter
es más claro y más explícito .Esto es útil para hacer declaraciones de ordenación compactas. Por ejemplo,
fuente
Desde el punto de vista del rendimiento, en python3.X
[i[0] for i in a]
ylist(zip(*a))[0]
son equivalenteslist(map(operator.itemgetter(0), a))
Código
salida
3.491014136001468e-05
3.422205176000717e-05
fuente
si las tuplas son únicas, entonces esto puede funcionar
fuente
ordereddict
embargo, puede funcionar .cuando corrí (como se sugirió anteriormente):
en lugar de regresar:
Recibí esto como la devolución:
Descubrí que tenía que usar list ():
para devolver con éxito una lista usando esta sugerencia. Dicho esto, estoy contento con esta solución, gracias. (probado / ejecutado usando Spyder, consola iPython, Python v3.6)
fuente
Estaba pensando que podría ser útil comparar los tiempos de ejecución de los diferentes enfoques, así que hice un punto de referencia (usando la biblioteca simple_benchmark )
I) Benchmark con tuplas con 2 elementos.
Como puede esperar seleccionar el primer elemento de las tuplas por índice,
0
muestra que es la solución más rápida muy cercana a la solución de desempaquetado esperando exactamente 2 valoresII) Punto de referencia que tiene tuplas con 2 o más elementos
fuente
Esas son tuplas, no conjuntos. Puedes hacerlo:
fuente
puedes desempacar tus tuplas y obtener solo el primer elemento usando una lista de comprensión:
salida:
esto funcionará sin importar cuántos elementos tenga en una tupla:
salida:
fuente
Me preguntaba por qué nadie sugirió usar numpy, pero ahora, después de comprobarlo, entiendo. Quizás no sea el mejor para matrices de tipo mixto.
Esta sería una solución en numpy:
fuente