Eu tenho uma lista como abaixo, onde o primeiro elemento é o id e o outro é uma string:
[(1, u'abc'), (2, u'def')]
Quero criar uma lista de IDs apenas dessa lista de tuplas, conforme abaixo:
[1,2]
Usarei essa lista __in
para que ela precise ser uma lista de valores inteiros.
você quer dizer algo assim?
O que você realmente tem é uma lista de
tuple
objetos, não uma lista de conjuntos (como sua pergunta original implicava). Se, na verdade, é uma lista de conjuntos, não há primeiro elemento porque os conjuntos não têm ordem.Aqui eu criei uma lista simples, porque geralmente isso parece mais útil do que criar uma lista de tuplas de 1 elemento. No entanto, você pode criar facilmente uma lista de tuplas de 1 elemento apenas substituindo
seq[0]
por(seq[0],)
.fonte
int() argument must be a string or a number, not 'QuerySet'
int()
não está em nenhum lugar da minha solução, então a exceção que você está vendo deve vir mais tarde no código.__in
para a filtragem de dados__in
? - Com base no exemplo de entrada que você deu, isso criará uma lista de números inteiros. No entanto, se sua lista de tuplas não começar com números inteiros, você não receberá números inteiros e precisará torná-los inteiros viaint
, ou tente descobrir por que seu primeiro elemento não pode ser convertido em um número inteiro.new_list = [ seq[0] for seq in yourlist if type(seq[0]) == int]
?Você pode usar "tuple unpacking":
No momento da iteração, cada tupla é descompactada e seus valores são definidos para as variáveis
idx
eval
.fonte
É para isso que
operator.itemgetter
serve.A
itemgetter
instrução retorna uma função que retorna o índice do elemento que você especificar. É exatamente o mesmo que escreverMas acho que isso
itemgetter
é mais claro e explícito .Isso é útil para fazer declarações de classificação compactas. Por exemplo,
fonte
Do ponto de vista do desempenho, em python3.X
[i[0] for i in a]
elist(zip(*a))[0]
são equivalenteslist(map(operator.itemgetter(0), a))
Código
resultado
3.491014136001468e-05
3.422205176000717e-05
fonte
se as tuplas são únicas, isso pode funcionar
fonte
ordereddict
, no entanto.quando eu corri (como sugerido acima):
em vez de retornar:
Eu recebi isso como o retorno:
Eu descobri que tinha que usar list ():
para retornar com êxito uma lista usando esta sugestão. Dito isto, estou feliz com esta solução, obrigado. (testado / executado usando Spyder, console iPython, Python v3.6)
fonte
Eu estava pensando que seria útil comparar os tempos de execução das diferentes abordagens, então fiz uma referência (usando simple_benchmark biblioteca )
I) Referência com tuplas com 2 elementos
Como você pode selecionar o primeiro elemento das tuplas por índice
0
, a solução é a mais rápida, muito próxima da solução de desempacotamento, esperando exatamente 2 valoresII) Referência com tuplas com 2 ou mais elementos
fonte
Essas são tuplas, não conjuntos. Você consegue fazer isso:
fonte
você pode descompactar suas tuplas e obter apenas o primeiro elemento usando uma compreensão de lista:
resultado:
isso funcionará, não importa quantos elementos você tenha em uma tupla:
resultado:
fonte
Gostaria de saber por que ninguém sugeriu usar numpy, mas agora depois de verificar eu entendo. Talvez não seja o melhor para matrizes de tipo misto.
Esta seria uma solução em numpy:
fonte