J'ai une liste comme ci-dessous où le premier élément est l'identifiant et l'autre est une chaîne:
[(1, u'abc'), (2, u'def')]
Je veux créer une liste d'identifiants uniquement à partir de cette liste de tuples comme ci-dessous:
[1,2]
J'utiliserai cette liste, __in
donc il doit s'agir d'une liste de valeurs entières.
Voulez-vous dire quelque chose comme ça?
Ce que vous avez en fait est une liste d'
tuple
objets, pas une liste d'ensembles (comme votre question initiale l'impliquait). S'il s'agit en fait d'une liste d'ensembles, alors il n'y a pas de premier élément car les ensembles n'ont pas d'ordre.Ici, j'ai créé une liste plate car cela semble généralement plus utile que de créer une liste de tuples à 1 élément. Cependant, vous pouvez facilement créer une liste de tuples à 1 élément en remplaçant simplement
seq[0]
par(seq[0],)
.la source
int() argument must be a string or a number, not 'QuerySet'
int()
n'est nulle part dans ma solution, donc l'exception que vous voyez doit venir plus tard dans le code.__in
pour filtrer les données__in
? - Sur la base de l'exemple d'entrée que vous avez donné, cela créera une liste d'entiers. Cependant, si votre liste de tuples ne commence pas par des entiers, vous n'obtiendrez pas d'entiers et vous devrez les rendre entiers viaint
, ou essayer de comprendre pourquoi votre premier élément ne peut pas être converti en entier.new_list = [ seq[0] for seq in yourlist if type(seq[0]) == int]
marche?Vous pouvez utiliser le "déballage de tuple":
Au moment de l'itération, chaque tuple est décompressé et ses valeurs sont définies sur les variables
idx
etval
.la source
C'est à ça que ça
operator.itemgetter
sert.L'
itemgetter
instruction renvoie une fonction qui renvoie l'index de l'élément que vous spécifiez. C'est exactement la même chose que d'écrireMais je trouve que
itemgetter
c'est plus clair et plus explicite .Ceci est pratique pour créer des instructions de tri compactes. Par exemple,
la source
Du point de vue des performances, dans python3.X
[i[0] for i in a]
etlist(zip(*a))[0]
sont équivalentslist(map(operator.itemgetter(0), a))
Code
production
3.491014136001468e-05
3.422205176000717e-05
la source
si les tuples sont uniques, cela peut fonctionner
la source
ordereddict
, cependant.quand j'ai couru (comme suggéré ci-dessus):
au lieu de retourner:
J'ai reçu ceci en retour:
J'ai trouvé que je devais utiliser list ():
pour renvoyer avec succès une liste en utilisant cette suggestion. Cela dit, je suis satisfait de cette solution, merci. (testé / exécuté avec Spyder, console iPython, Python v3.6)
la source
Je pensais qu'il pourrait être utile de comparer les temps d'exécution des différentes approches alors j'ai fait un benchmark (en utilisant la bibliothèque simple_benchmark )
I) Benchmark ayant des tuples avec 2 éléments
Comme vous pouvez vous attendre à sélectionner le premier élément parmi les tuples par index, se
0
révèle être la solution la plus rapide très proche de la solution de déballage en s'attendant à exactement 2 valeursII) Benchmark ayant des tuples avec 2 éléments ou plus
la source
Ce sont des tuples, pas des ensembles. Tu peux le faire:
la source
vous pouvez décompresser vos tuples et obtenir uniquement le premier élément en utilisant une compréhension de liste:
production:
cela fonctionnera quel que soit le nombre d'éléments que vous avez dans un tuple:
production:
la source
Je me suis demandé pourquoi personne n'avait suggéré d'utiliser numpy, mais maintenant, après avoir vérifié, je comprends. Ce n'est peut-être pas le meilleur pour les tableaux de type mixte.
Ce serait une solution dans numpy:
la source