2017-10-18 6 views
0

J'essaie d'utiliser Python 3 pour utiliser list_one afin de trier list_two et de sortir vers list_sorted. Si la valeur d'un champ est manquante alors j'aimerais voir une valeur nulle placée. La sortie aurait le même nombre d'éléments que list_oneUtiliser une liste pour en trier une autre

list_one = ['one', 'two', 'three', 'four', 'five', 'six', 'seven'] 
list_two = ['seven', 'five', 'four', 'three', 'one'] 
list_sorted = [] 

for i in list_one: 
    for field in list_two: 
     if i == field: 
      list_sorted.append(field) 
     else: 
      list_sorted.append(None) 

print ('final output:', list_sorted) 

La sortie souhaitée est la suivante:

['one', None, 'three', 'four', 'five', None, 'seven'] 

Mais il est sortie en fait:

[None, None, None, None, 'one', None, None, None, None, None, None, None, None, 'three', None, None, None, 'four', None, None, None, 'five', None, None, None, None, None, None, None, None, 'seven', None, None, None, None] 

Ma pensée actuelle est la réponse implique enumerate mais je ne suis pas sur. Toute aide serait considérablement apprécié.

+0

Ne ressemble pas vraiment à un tri. –

Répondre

1

Convertissez list_two en un ensemble, puis créez une liste de compréhension en fonction de si cet élément est dans list_two ou non.

set_two = set(list_two) 
list_sorted = [x if x in set_two else None for x in list_one] 

print(list_sorted) 
['one', None, 'three', 'four', 'five', None, 'seven'] 
+0

C'est génial! Merci @coldspeed. J'ai quelques lectures à faire. Je ne sais pas si cela est approprié pour StackOverflow, mais j'ai deux autres questions: Est-ce ce qu'ils appellent «ternaire» ou sténographie? Et si oui, quelle est la version longue? Je ne comprends pas ce qui se passe là-bas. La deuxième question est de savoir si list_two est bidimensionnel? – Jarvis

+0

@Jarvis Non, cela s'appelle une "compréhension de liste". Un ternaire ou raccourci est un concept différent impliquant des instructions if-else en cascade sur une seule ligne (vous ne le voyez pas ici). Quant à votre deuxième question, la solution serait similaire, il vous suffit d'étendre les dimensions de 1. Si vous voulez savoir comment faire, posez une nouvelle question. En outre, vous pouvez marquer la réponse la plus utile acceptée, alors s'il vous plaît envisager de le faire. Merci. –

1

Vous n'êtes pas vraiment quoi que ce soit le tri, mais il semble que vous pouvez réaliser ce que vous vouliez simplement tester si i est présent dans list_two. Retirez la boucle intérieure for.

list_one = ['one', 'two', 'three', 'four', 'five', 'six', 'seven'] 
list_two = ['seven', 'five', 'four', 'three', 'one'] 
list_sorted = [] 

for i in list_one: 
    if i in list_two: 
     list_sorted.append(i) 
    else: 
     list_sorted.append(None) 

print ('final output:', list_sorted) 
+0

Mieux convertir en un ensemble pour une recherche rapide! https://stackoverflow.com/a/46801255/4909087 –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ Cela a l'air beaucoup plus court, ce qui est vraiment beau, mais est-ce vraiment plus rapide? Je vois un 'pour x dans list_one' et' x si x dans set_two else None, qui ressemble assez à ce que j'ai. Mais je n'écris pas beaucoup de Python - est-ce la façon la plus pythonienne de faire ça? –

+1

Le bit important est 'x si x dans set_two else None' ce qui facilite la recherche constante, puisque les ensembles peuvent supporter la recherche dans O (1), tandis que les listes (comme list_two) ne le peuvent pas. La différence ne peut pas être vue dans les petites listes, mais cette méthode est quadratique en complexité. Encore, bel effort, donc vous avez mon vote :) –