Un progtwig que identifica palabras individuales en una oración, las almacena en una lista y reemplaza cada palabra con la posición de esa palabra en la lista

Estoy desarrollando un progtwig que identifica palabras individuales en una oración, las almacena en una lista y reemplaza cada palabra en la oración original con la posición de esa palabra en la lista, por lo que la oración se puede recrear a partir de las posiciones de estas palabras en esta lista utilizando la secuencia 1,2,3,4,5,6,7,8,9,1,3,9,6,7,8,4,5 . Mi código hasta ahora está abajo, pero necesito algunos consejos sobre cómo hacerlo más eficiente y más corto:

 import time sentence = "ASK NOT WHAT YOUR COUNTRY CAN DO FOR YOU ASK WHAT YOU CAN DO FOR YOUR COUNTRY" s = sentence.split() another = [0] time.sleep(0.5) print(sentence) for count, i in enumerate(s): if s.count(i) < 2: another.append(max(another) + 1) else: another.append(s.index(i) +1) another.remove(0) time.sleep(0.5) print(another) 

Aquí hay un algoritmo lineal:

 position = {} # word -> position words = sentence.split() for word in words: if word not in position: # new word position[word] = len(position) + 1 # store its position print(*map(position.__getitem__, words), sep=",") # -> 1,2,3,4,5,6,7,8,9,1,3,9,6,7,8,4,5 

La llamada a print() usa la syntax de Python 3 * para descomprimir el resultado devuelto por map() que devuelve las posiciones para las palabras correspondientes aquí. Consulte ¿Qué hacen los parámetros ** (estrella doble) y * (estrella) para los parámetros?

Para obtener una lista de posiciones de palabras en sentence y volver a crear la oración original de esta lista:

 sentence = "ASK NOT WHAT YOUR COUNTRY CAN DO FOR YOU ASK WHAT YOU CAN DO FOR YOUR COUNTRY" s = sentence.split() positions = [s.index(x)+1 for x in s] recreated = [s[i-1] for i in positions] # the reconstructed sentence print(" ".join(recreated)) # the list of index numbers/word positions print(positions) # the positions as a space separated string of numbers print(" ".join(positions) 

Las listas tienen un índice de cero, por lo que el primer elemento es el índice 0, no 1. Por supuesto, podría agregar 1 a todos los índices en la lista de comprensión si quisiera que comenzara en 1.

Para obtener exactamente el mismo resultado que produce su script:

 sentence = "ASK NOT WHAT YOUR COUNTRY CAN DO FOR YOU ASK WHAT YOU CAN DO FOR YOUR COUNTRY" s = sentence.split() positions = [s.index(x)+1 for x in s] print(sentence) print(positions) 

Salida:

 ASK NOT WHAT YOUR COUNTRY CAN DO FOR YOU ASK WHAT YOU CAN DO FOR YOUR COUNTRY [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 3, 9, 6, 7, 8, 4, 5] 
 sentence = 'ASK NOT WHAT YOUR COUNTRY CAN DO FOR YOU ASK WHAT YOU CAN DO FOR YOUR COUNTRY' words = sentence.split() # Counting backwards through the words means the last seen one will have # the lowest index without needing 'if' tests or incrementing counters. positions = {word:index for index, word in reversed(list(enumerate(words, 1)))} print(' '.join(str(positions.get(word)) for word in words)) 

Pruébelo en repl.it aquí: https://repl.it/CHvy/0

No terriblemente eficiente, pero dos líneas.

 words = sentence.split() positions = [words.index(word) + 1 for word in words] 

Tenga en cuenta que list.index(entry) devolverá el índice de la primera aparición de la entry . Si estás de acuerdo con los índices basados ​​en 0, lo siguiente es bastante conciso:

 positions = list(map(words.index, words))