Уведомления

Группа в Telegram: @pythonsu

#1 Март 11, 2015 04:29:39

Aspergo
Зарегистрирован: 2014-08-31
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Перевод результата цикла for в строку

Здравствуйте!
Знаю, что вопрос глупый, но в гугле не удалось найти ответ. Есть код, который преобразует введенный текст и выдает результат. Только результат выдается по букве, в столбец.

i=raw_input('Enter secret text:')
al1='ABCDEFGHIJKLMNOPQRSTUWXYZ'
al2='abcdefghijklmnopqrstuwxyz'
list=list(i)
while ' ' in list:
  list.remove(' ')
key=int(raw_input('Enter desired key:'))
for letter in list:
    if letter in al1:
      print al1[int(al1.find(letter))+key]
    elif letter in al2:
      print al2[int(al2.find(letter))+key]
Как преобразовать результат в строку? Есть ли какой-то метод?

Офлайн

#2 Март 11, 2015 04:58:25

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Перевод результата цикла for в строку

никогда так не делайте!

list=list(i)
Aspergo
Есть ли какой-то метод?
есть, но код будет некрасив
вот одно из решений
i=raw_input('Enter secret text:')
al1='ABCDEFGHIJKLMNOPQRSTUWXYZ'
al2='abcdefghijklmnopqrstuwxyz'
list=list(i)
while ' ' in list:
  list.remove(' ')
key=int(raw_input('Enter desired key:'))
s = ''
for letter in list:
    if letter in al1:
        s += al1[int(al1.find(letter))+key]
    elif letter in al2:
        s += al2[int(al2.find(letter))+key]
print s
эт типа шифр Цезаря)) главная ошибка что на такой текст “zzz” с любым ключом будет ошибка
ну если хотите чтобы прям два алфавита было, могу предложить вот так
i=raw_input('Enter secret text:')
key=int(raw_input('Enter desired key:'))
al1='ABCDEFGHIJKLMNOPQRSTUWXYZ'
al2='abcdefghijklmnopqrstuwxyz'
f = lambda al, j: al[(al.index(j) + key) % len(al)]
print ''.join(f((al1, al2)[j.islower()], j) for j in i)



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Март 11, 2015 05:07:02)

Офлайн

#3 Март 11, 2015 09:42:40

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Перевод результата цикла for в строку

import string
alphabet = string.ascii_lowercase
in_text = raw_input('Enter text')
key = input("Enter key")
mapper = zip(alphabet, alphabet[key:] + alphabet[:key])
mapper = mapper + [(k.upper(), v.upper()) for k, v in mapper]
mapper = dict(mapper)
out_text = "".join(mapper.get(x, x) for x in in_text)
print out_text



Офлайн

#4 Март 11, 2015 10:06:27

john123
Зарегистрирован: 2013-12-22
Сообщения: 56
Репутация: +  7  -
Профиль   Отправить e-mail  

Перевод результата цикла for в строку

Автор, вот то что Вам нужно:

import sys
  
i=raw_input('Enter secret text:')
  
al1='ABCDEFGHIJKLMNOPQRSTUWXYZ':)
al2='abcdefghijklmnopqrstuwxyz'
  
list=list(i)
while ' ' in list:
  list.remove(' ')
  
key=int(raw_input('Enter desired key:'))
  
for letter in list:
    if letter in al1:
      sys.stdout.write(al1[int(al1.find(letter))+key])
    elif letter in al2:
      sys.stdout.write(al2[int(al2.find(letter))+key])

Функция/оператор print автоматически добавляет символ переноса строки, поэтому в таких случаях лучше использовать sys.stdout.write()
Всё что указано в ответах выше, вы меня извините, это какой-то наркоманский бред

Кстати только что заметил конструкцию:
list=list(i)
while ' ' in list:
  list.remove(' ')
Для таких вещей у строк в Питоне есть метод replace.
Можно заменить Ваш код вот таким:
i = raw_input('Enter secret text:').replace(' ', '')
И далее использовать в цикле непосредственно строку, без преобразования в список:
for letter in i:
   ...

Таким образом получится примерно вот так:
import sys
  
i = raw_input('Enter secret text:').replace(' ', '')
  
al1 = 'ABCDEFGHIJKLMNOPQRSTUWXYZ':)
al2 = 'abcdefghijklmnopqrstuwxyz'
  
key = int(raw_input('Enter desired key:'))
  
for letter in i:
    if letter in al1:
      sys.stdout.write(al1[int(al1.find(letter))+key])
    elif letter in al2:
      sys.stdout.write(al2[int(al2.find(letter))+key])

Отредактировано john123 (Март 11, 2015 10:36:45)

Офлайн

#5 Март 11, 2015 10:11:26

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Перевод результата цикла for в строку

john123,
не нужно ему это! За такой говнокод надо линейкой по рукам лупить.



Офлайн

#6 Март 11, 2015 10:15:53

john123
Зарегистрирован: 2013-12-22
Сообщения: 56
Репутация: +  7  -
Профиль   Отправить e-mail  

Перевод результата цикла for в строку

FishHook
john123,не нужно ему это! За такой говнокод надо линейкой по рукам лупить.
Думаю, если человек постит свои вопросы (особенно такие) в раздел “Python для новичков”, это означает что он действительно новичок
Ваше решение конечно сильно круче, но загружать человека функциональщиной и генераторами прямо вот так сходу, думаю, не стоит, тем более что интересовался он про конкретную функцию, исходя из смысла его вопроса

Отредактировано john123 (Март 11, 2015 10:20:21)

Офлайн

#7 Март 11, 2015 10:22:53

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Перевод результата цикла for в строку

john123,
Если хочешь помочь человеку, то укажи ему на ошибки. Он же думает, что вот это вот

list=list(i)
while ' ' in list:
  list.remove(' ')
нормально. Пускай “действительно новичку” это позволено, но ты то зачем это копипастишь? Я уже не говорю, что сам по себе совет менять принт на sys.stdout.write несколько странный.



Офлайн

#8 Март 11, 2015 10:39:03

john123
Зарегистрирован: 2013-12-22
Сообщения: 56
Репутация: +  7  -
Профиль   Отправить e-mail  

Перевод результата цикла for в строку

FishHook
Пускай “действительно новичку” это позволено, но ты то зачем это копипастишь? Я уже не говорю, что сам по себе совет менять принт на sys.stdout.write несколько странный.
Я только потом заметил проблему с list(i) и уже исправил сообщение.
Вообще ситуация на форуме напоминает мне известный анекдот:
На американском форуме задаёшь вопрос, тебе дают ответ.
На израильском форуме задаёшь вопрос, тебе задают встречный вопрос.
На русском форуме задаёшь вопрос, тебе долго рассказывают, какой ты мудак.
Поэтому как сказал кот Леопольд: “Ребята, давайте жить дружно”

Отредактировано john123 (Март 11, 2015 10:39:46)

Офлайн

#9 Март 11, 2015 10:56:28

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Перевод результата цикла for в строку

1.

оператор print автоматически добавляет символ переноса строки
чтобы этого избежать достаточно завершить оператор запятой
print i,
2.
int(al1.find(letter))
зачем int приводить к int?
3.
Алгоритм плохой. Каждый поиск в строке
letter in al1 - это перебор списка от нулевого элемента до позиции letter или до конца списка.
al1.find(letter) - это еще один такой же аналогичный перебор, который вы выполняете непосредственно за первым. Во-первых, можно сделать так:
index = al1.find(letter)
if index > -1:
    print ....
но лучше использовать единожды построенный словарь, поиск вхождения в котором операция гораздо менее накладная, чем в цикле искать вхождение в строку. Это есть питон-вей.



Офлайн

#10 Март 11, 2015 11:07:42

john123
Зарегистрирован: 2013-12-22
Сообщения: 56
Репутация: +  7  -
Профиль   Отправить e-mail  

Перевод результата цикла for в строку

FishHook
чтобы этого избежать достаточно завершить оператор запятой

print i,
Дело в том, что такой вариант будет оставлять пробелы между буквами, что на мой взгляд, не очень подходит к указанному автором варианту.
Попробуйте у себя в консоли Python:
s = 'abcd'
for c in s:
    print c,
Результат будет такой:
a b c d

Отредактировано john123 (Март 11, 2015 11:12:47)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version