2016-12-30 9 views
0
alpha = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"] 

, что это списокКак найти элемент в списке со своей позиции (который я нашел, используя индекс()) в питоне

for letters in sentence: 
    pos2 = alpha.index(letters) + 1 
    #to find the positions of each letter 
    new_sentence.append(pos2) 
    #to add each position to the empty list 
print (new_sentence) 

это то, что я использовал, чтобы найти позиции каждого письмо в введенном сообщении в списке алфавита

Сейчас я хочу, чтобы преобразовать его обратно в письма с позиций ..

+0

Ваш текущий код очень эффективен, поскольку он ищет в списке значений в то время как сквозными по списку, так это будет O (n^2) сложность. Вам лучше заменить это на 'для индекса, буквы в перечислении (предложение, 1):'. Тогда нет необходимости добавлять его в индекс. – ForceBru

+0

Вы всегда должны включать минимальный пример * input * и ожидаемый результат с вопросами. – wwii

+0

http://stackoverflow.com/help/how-to-ask, http://stackoverflow.com/help/mcve – wwii

ответ

1
alpha_text = "" 
for i in new_sentence: 
    alpha_text = alpha_text + alpha[i - 1] 
print(alpha_text) 

Так весь ваш код будет выглядеть следующим образом:

sentence = "lololololololololol" #your text 
alpha = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"] 
new_sentence = [] 
for letters in sentence: 
    pos2 = alpha.index(letters) + 1 
    #to find the positions of each letter 
    new_sentence.append(pos2) 

print (new_sentence) 
alpha_text ="" 
for i in new_sentence: 
    alpha_text = alpha_text + alpha[i - 1] 
print(alpha_text) 

выход:

[12, 15, 12, 15, 12, 15, 12, 15, 12, 15, 12, 15, 12, 15, 12, 15, 12, 15, 12] 

lololololololololol 
4

Вы можете индексировать его:

[alpha[p-1] for p in new_sentence] 

sentence = "helloworld" 
# ... run your code to get the new_sentence 
''.join(alpha[p-1] for p in new_sentence) 

# 'helloworld' 

Если вы намереваетесь найти письмо после оригинального письма, вы можете взять оставшуюся часть индекса, как от комментария @RushyPanchal:

sentence = "hello world" 

# ... run your code to get the new_sentence 
''.join(alpha[p % len(alpha)] for p in new_sentence) 

# 'ifmmpxpsme' 
+0

Кажется, что он просто выполняет смену - так что вы действительно можете захотеть 'alpha [p% len (alpha)]'. –

+0

@ RushyPanchal О, я тебя достал. Возможно. – Psidom

1

Потому что вы иметь индекс, вы можете захватить значение по этому индексу.

print my_list[pos2] 

питона также имеет встроенный метод enumerate(enumerable_obj) который возвращает index, value пар

for index, value in enumerate(my_list): 
    print index, value 
+0

ОК, поэтому я сделал 'print (alpha [char])' –

+0

, и он вышел с индексом «list out out range» –

1

@ Ответ Psidom - это правильный способ получить список символов из строки.

Однако, если вы хотите просто переместить символы, вы можете использовать chr and ord функции:

sentence = "some string" 
shifted_sentence = ''.join(chr(ord(c)+1) for c in sentence) 
+0

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

0

С точки зрения производительности, это должно быть легче сделать словарь букв и их значения и вице- наоборот. Таким образом, вы используете только постоянное время для каждого поиска. Это изменение делает ваш код намного более масштабируемым и быстрым.

-1

Ваш текущий подход неэффективен, потому что вам нужно найти до 26 разных элементов списка для каждой буквы в вашем исходном предложении. Он также терпит неудачу для буквы «z», поскольку после «z» в списке нет ничего.

Поскольку вы уточнить, что вы пытаетесь сделать keyword cipher, более эффективный метод должен был бы использовать str.translate:

import string 

keyword = 'stack' 
source = string.ascii_lowercase 
target = keyword + ''.join(filter(lambda x: x not in keyword, source)) 

sentence = 'encode me' 
encoded = sentence.translate(str.maketrans(source, target)) 

print(encoded) 

Выход:

klamck jk 
+0

нет нет ключевого слова шифр –

+0

@ZahraHaiderBilal Спасибо за разъяснение и извините за комментарий спама. Обновлено мое решение. – ThisSuitIsBlackNot

0

подход работы с enumerate() и filter():

>>> sentence = 'hello' 

Для этого примера:

>>> new_sentence 
[8, 5, 12, 12, 15] 

Результат выглядит следующим образом:

>>> letters_enum = [(j,c) for j,c in enumerate(alpha, 1) if j in new_sentence] 
>>> result = [] 
>>> for i in new_sentence: 
...  letter = list(filter(lambda item: item[0] == i, letters_enum)) 
...  result.extend(letter[0][1]*len(letter)) 
... 
>>> 
>>> result 
['h', 'e', 'l', 'l', 'o']