Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 16, 2016 08:55:45

sl0w
Зарегистрирован: 2016-04-28
Сообщения: 109
Репутация: +  1  -
Профиль   Отправить e-mail  

Перебор списка по смещенному индексу

Доброе утро, решил поупражняться в питоне и набрел на сайт http://www.pythonchallenge.com/pc/def/map.html

первая задачка ушла влет

теперь мучаюсь с перебором списка

задание такое:


g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.

код реализовывал таким способом (даже не приводил ничего в порядок, как писал так и писал)

x = ['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']
# k -->m
# o -->q
# e -->g
e = []
s = []
m = []
q = []
y = ["g fmnc wms bgblr rpylqjyrc gr zw fylb rfyrq ufyr amknsrcpq ypc dmp bmgle gr gl zw fylb gq glcddgagclr ylb rfyrq ufw rfgq rcvr gq qm jmle sqgle qrpgle kyicrpylq() gq pcamkkclbcb lmu ynnjw ml rfc spj"]
for i in y:
    if len(i)>1:
        for t in i:
            e.append(t)
        else:
            e.append(i)
#print(e)
for i in e:
    for b in x:
        if i ==b:
            s.append(x.index(b)+2)
for i in s:
    if i == 26:
        i = 1 
    elif i == 27:
        i = 2
    
        m.append(i)
    else:
        m.append(i)
print(m)
for i in m:
    print(x[i], end = '')

в конце выводит тарабарщину : ihopeyoudidnttrnslteitcyhndthtswhtcomputersrefordoingitincyhndisinefficientndthtswhythistextissolongusingstringmketrnsisrecommendednowpplyontheurl

вроде часть текста есть, а вроде часть текста - что то невообразимое

буду рад если подскажите сто не так

Офлайн

#2 Июнь 16, 2016 09:28:26

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

Перебор списка по смещенному индексу

for i in y:
    if len(i)>1:
i - это одна буква слова y, как у неё длина может отличаться от единицы?



Офлайн

#3 Июнь 16, 2016 09:40:21

sl0w
Зарегистрирован: 2016-04-28
Сообщения: 109
Репутация: +  1  -
Профиль   Отправить e-mail  

Перебор списка по смещенному индексу

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

x = ['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']
# k -->m
# o -->q
# e -->g
e = []
s = []
m = []
y = ["g fmnc wms bgblr rpylqjyrc gr zw fylb rfyrq ufyr amknsrcpq ypc dmp bmgle gr gl zw fylb gq glcddgagclr ylb rfyrq ufw rfgq rcvr gq qm jmle sqgle qrpgle kyicrpylq() gq pcamkkclbcb lmu ynnjw ml rfc spj"]
for i in y:
    e.append(i)
#print(e)
for i in e:
    for b in x:
        if i ==b:
            s.append(x.index(b)+2)
for i in s:
    if i == 26:
        i = 1 
    elif i == 27:
        i = 2
    
        m.append(i)
    else:
        m.append(i)
print(m)
for i in m:
    print(x[i], end = '')

Отредактировано sl0w (Июнь 16, 2016 09:42:12)

Офлайн

#4 Июнь 16, 2016 10:03:48

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

Перебор списка по смещенному индексу

sl0w
Давайте по порядку. Ваши циклы в цикле - это плохо. Хардкодить размер сдвига - еще хуже. А реализация этого сдвига - совсем плохо. Для начала сделайте словарь соответствия исходного алфавита сдвинутому. Это очень просто: вы делите исходный алфавит на две части в соответствии со значением сдвига. Если сдвиг == 12, то первая часть - это первые 12 символов, вторая - остальные. Потом вы меняете части местами, и получаете сдвинутый алфавит. Из исходного и сдвинутого алфавитов собираете словарь. А по словарю уже изменяете нужный текст.



Отредактировано FishHook (Июнь 16, 2016 10:05:11)

Офлайн

#5 Июнь 16, 2016 10:21:10

Firik
Зарегистрирован: 2015-12-02
Сообщения: 151
Репутация: +  6  -
Профиль   Отправить e-mail  

Перебор списка по смещенному индексу

sl0w
Вашем же способом получается что то такое

x = ['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'] 
# k -->m 
# o -->q 
# e -->g 
s = [] 
st=''
y = "g fmnc wms bgblr rpylqjyrc gr zw fylb rfyrq ufyr amknsrcpq ypc dmp bmgle gr gl zw fylb gq glcddgagclr ylb rfyrq ufw rfgq rcvr gq qm jmle sqgle qrpgle kyicrpylq() gq pcamkkclbcb lmu ynnjw ml rfc spj" 
splittedstr = y.split()
for i in splittedstr: 
    for b in i: 
        if b in x: 
            a=(x.index(b)+2)
    
            if a==26:
                a=0
            elif a==27:
                a=1
            st+=x[a]
        else:
            st+=b
    s.append(st)
    st=''
print(' '.join(s))

Отредактировано Firik (Июнь 16, 2016 10:24:10)

Офлайн

#6 Июнь 16, 2016 10:40:47

sl0w
Зарегистрирован: 2016-04-28
Сообщения: 109
Репутация: +  1  -
Профиль   Отправить e-mail  

Перебор списка по смещенному индексу

переделал немного код

# алфавит и строка
x = ['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']
y = ["g fmnc wms bgblr rpylqjyrc gr zw fylb rfyrq ufyr amknsrcpq ypc dmp bmgle gr gl zw fylb gq glcddgagclr ylb rfyrq ufw rfgq rcvr gq qm jmle sqgle qrpgle kyicrpylq() gq pcamkkclbcb lmu ynnjw ml rfc spj"]
s = []
m = []
 
for i in y: 
    for t in i:
        for b in x:
            if b == t:              #если значение в строке y и словаре совпадает, то
                if x.index(b)>23:
                    q = x.index(b)-24
                    s.append(q)
                else:
                    s.append(x.index(b)+2)
#print(s)
for i in s:
    print(x[i], end = ' ')

Отредактировано sl0w (Июнь 16, 2016 10:45:40)

Офлайн

#7 Июнь 16, 2016 10:42:30

sl0w
Зарегистрирован: 2016-04-28
Сообщения: 109
Репутация: +  1  -
Профиль   Отправить e-mail  

Перебор списка по смещенному индексу

Firik
sl0wВашем же способом получается что то такое
большое спасибо, буду разбираться в вашем образце

я понял в чем вся путаница была: я ошибся в вычитании , потому как нумерация в списке идет с 0

Отредактировано sl0w (Июнь 16, 2016 10:46:55)

Офлайн

#8 Июнь 17, 2016 01:32:19

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Перебор списка по смещенному индексу

Вот к примеру решение достаточно простое, проверяющее границы

#!/usr/bin/env python3
class Shifter:
    def __init__(self, value, shift):
        self._value = value
        self._shift = shift
        self._max_index = len(value) - 1
        self._length = len(value)
    def shift(self, key):
        index = self._value.index(key) + self._shift
        if index > 0:
            while index > self._max_index:
                index -= self._length
        elif index < 0:
            while index < 0:
                index += self._length
        return self._value[index]
if __name__ == '__main__':
    shifter = Shifter('abcdef', 1)
    assert 'b' == shifter.shift('a')
    assert 'a' == shifter.shift('f')
    assert 'f' == shifter.shift('e')
    shifter = Shifter('abcdef', 6)
    assert 'a' == shifter.shift('a')
    assert 'f' == shifter.shift('f')
    assert 'e' == shifter.shift('e')
    shifter = Shifter('abcdef', 12)
    assert 'a' == shifter.shift('a')
    assert 'f' == shifter.shift('f')
    assert 'e' == shifter.shift('e')
    shifter = Shifter('abcdef', -1)
    assert 'f' == shifter.shift('a')
    assert 'e' == shifter.shift('f')
    assert 'd' == shifter.shift('e')
    shifter = Shifter('abcdef', -6)
    assert 'a' == shifter.shift('a')
    assert 'f' == shifter.shift('f')
    assert 'e' == shifter.shift('e')



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#9 Июнь 17, 2016 07:21:32

Vigi
От: Курья, Алтай
Зарегистрирован: 2015-02-07
Сообщения: 144
Репутация: +  8  -
Профиль   Отправить e-mail  

Перебор списка по смещенному индексу

Музыкой навеяло

text = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
tmp = []
for i in text:
    if i == ' ' or i =="'" or i =='.' or i == '(' or i == ')':
        tmp.append(i)
        continue
    if ord(i) == 121:
        tmp.append('a')
    if ord(i) == 122:
        tmp.append('b')
    tmp.append(chr(ord(i) + 2))
print (''.join([txt for txt in tmp if txt != '{' and txt != "|"]))

Отредактировано Vigi (Июнь 17, 2016 07:24:51)

Офлайн

#10 Июнь 18, 2016 21:21:14

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Перебор списка по смещенному индексу

добавлю свои пять копеек кода

text = '''g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq 
             glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu 
             ynnjw ml rfc spj.'''
            
alphabet = [chr(i) for i in range(ord('a'),ord('z')+1)]
len_alphabet = len(alphabet)
shift_text = ''
for i in text:
    if i.isalpha():
        index_i = alphabet.index(i)
        i = alphabet [ (len_alphabet + index_i+2 ) % len_alphabet] 
    shift_text += i
print( shift_text)
результат
>>> i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is
inefficient and that's why this text is so long. using string.maketrans() is recommended. now
apply on the url.

Отредактировано marvellik (Июнь 18, 2016 21:32:08)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version