2016-12-13 1 views
0
from collections import OrderedDict 
sentence= ("ask not what your country can do for you ask what you can do for your country").lower() 
words = sentence.split(' ') 

lst = list(OrderedDict.fromkeys(words)) 
print(lst) 
print(words) 

В этом коде я разделил слова в отдельности в предложении и перечислил их в список отдельных слов, которые появились в предложение. Тем не менее, то, что я хочу сделать дальше, - это то, как заменить слова в списке на позицию, в которой он входит, в предложении. Я довольно тупой и любезно люблю какую-то помощь. Спасибо: Dпытается заменить слова в списке с положением, в котором оно входит, в предложении

, например, желаемый результат будет в LST переменной, список будет:

['ask', 'not', 'what', 'your', 'country', 'can', 'do', 'for', 'you'] 

и под другой переменной, может быть, я хотел бы светящуюся выйти что-то вроде :

['0', '1', '2', '3', '4', '5', '6', '7', '8'] 

поэтому под всем предложении:

"ask not what your country can do for you ask what you can do for your country" 

это будет выглядеть л икэ это:

['0', '1', '2', '3', '4', '5', '6', '7', '8','0','2','8','4','5','6','3','4'] 
+0

Не забудьте дать нам пример вывода - это помогает довольно много, если в вопросе возникает лингвистическая путаница. Например, пример вывода может быть «final_list = [0, 1, 2, 3]» или что-то в этом роде? – Torxed

+0

Пожалуйста, покажите свой желаемый результат; ваше предложение содержит каждое слово несколько раз, поэтому для каждого слова нет _one_ index. Какой список вы ожидаете? – jbndlr

+0

Итак, вы хотите просто: 'result = [для i в диапазоне (0, len (words))]'? – Torxed

ответ

4

Предполагая, что вы хотите найти все позиционные индексы всех уникальных слов в предложении, вы можете создать dict следующим образом:

import pprint 
sentence = ('ask not what your country can do for you ask what you can do for your country').lower() 
words = sentence.split(' ') 

# Use a dict and map all indices to each unique word 
words_ix = {w: [] for w in set(words)} 
for ix, w in enumerate(words): 
    words_ix[w].append(ix) 
pprint.pprint(words_ix) 

# Use a list and collect the index of the first occurrence of each word 
words_px = [words.index(w) for w in words] 
pprint.pprint(words_px) 

Урожайность:

{'ask': [0, 9], 
'can': [5, 12], 
'country': [4, 16], 
'do': [6, 13], 
'for': [7, 14], 
'not': [1], 
'what': [2, 10], 
'you': [8, 11], 
'your': [3, 15]} 

[0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 2, 8, 5, 6, 7, 3, 4] 

Выберите любое решение, соответствующее вашим потребностям.

+0

Я подумывал пропустить строку и добавить первый индекс каждого слова в список. Но это лучше, приятно и чисто. –

+0

Это лучше, чем мой ответ, если каждая позиция слова необходима. – asongtoruin

0

Если вам не требуется явно OrderedDict, вы можете сделать это достаточно просто с помощью set и index.

sentence = ("ask not what your country can do for you ask what you can do for your country").lower() 
words = sentence.split(' ') 

pos_dict = {} 

for word in set(words): 
    pos_dict[word] = words.index(word) 

print pos_dict 

Мы создаем пустой словарь, а затем цикл над set уникальных слов, найденных в нашем предложении. Затем мы используем index, чтобы найти положение слова в первоначальном списке, который мы создали, чтобы найти его первое вхождение.

EDIT: Поскольку редактирование вопроса, есть хороший Однострочник, чтобы получить результат из:

sentence = ("ask not what your country can do for you ask what you can do for your country").lower() 
words = sentence.split(' ') 

word_pos = [words.index(word) for word in words] 

print word_pos 

возвращает [0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 2, 8, 5, 6, 7, 3, 4]

0

попробуйте следующий код:

from collections import OrderedDict 
sentence= ("ask not what your country can do for you ask what you can do for your country").lower() 
words = sentence.split(' ') 

lst = list(OrderedDict.fromkeys(words)) 
numberLst = [] 
for word in words: 
    # print lst.index(word) 
    numberLst.append(lst.index(word)) 

print(words) 
print numberLst # numberLst is the output that you want 
0

Возможно, это вам поможет:

sentence = "ask not what your country can do for you ask what you can do for your country" 
words = sentence.split(' ') 

new = [str(words.index(x)) for x in words] 

print(words) 
print(new) 
0

Эта версия назначает последовательные номера (начиная с нуля) каждому новому слову. Он использует простой словарь для отслеживания того, какие слова были замечены, и мы можем просто использовать текущий размер словаря как индексный номер для каждого нового слова.

sentence = "ask not what your country can do for you ask what you can do for your country" 

d = {} 
lst = [] 
words = sentence.lower().split() 
for w in words: 
    if w in d: 
     i = d[w] 
    else: 
     d[w] = i = len(d) 
    print(i, w) 
    lst.append(i) 

print(lst) 

выход

0 ask 
1 not 
2 what 
3 your 
4 country 
5 can 
6 do 
7 for 
8 you 
0 ask 
2 what 
8 you 
5 can 
6 do 
7 for 
3 your 
4 country 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 2, 8, 5, 6, 7, 3, 4] 

Обратите внимание, что i номер слова является не индекс первого вхождения слова в предложении. Если вы на самом деле этого хотите, вы можете использовать

lst = [words.index(w) for w in words] 

как jbndl предлагает в комментариях.

Посмотрите, что происходит, когда мы повторяем слово, прежде чем все уникальные слова, которые были добавлены в словарь:

sentence = "ask not what your country can not do for you"  

выходного

0 ask 
1 not 
2 what 
3 your 
4 country 
5 can 
1 not 
6 do 
7 for 
8 you 
[0, 1, 2, 3, 4, 5, 1, 6, 7, 8] 
+0

Путь слишком сложный; это сводится к '[words.index (w) для w в словах]'. – jbndlr

+1

@jbndlr Ваш список comp явно более компактен, чем мой код, но это O (n^2) (хотя O (n) of 'words.index' работает со скоростью C), тогда как my - O (n). Но мой код не всегда дает тот же результат, что и ваш, как показано во втором примере предложения, которое я только что добавил. –

+0

О, право. Тем не менее, я не знал об этом случае в вашем решении. Хорошо, что вы указали это, может оказаться важным, если это решение будет использовано. – jbndlr

Смежные вопросы