Найти - Пользователи
Полная версия: Перебор списка по смещенному индексу
Начало » Python для новичков » Перебор списка по смещенному индексу
1 2
sl0w
Доброе утро, решил поупражняться в питоне и набрел на сайт 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

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

буду рад если подскажите сто не так
FishHook
for i in y:
    if len(i)>1:
i - это одна буква слова y, как у неё длина может отличаться от единицы?
sl0w
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 = '')
FishHook
sl0w
Давайте по порядку. Ваши циклы в цикле - это плохо. Хардкодить размер сдвига - еще хуже. А реализация этого сдвига - совсем плохо. Для начала сделайте словарь соответствия исходного алфавита сдвинутому. Это очень просто: вы делите исходный алфавит на две части в соответствии со значением сдвига. Если сдвиг == 12, то первая часть - это первые 12 символов, вторая - остальные. Потом вы меняете части местами, и получаете сдвинутый алфавит. Из исходного и сдвинутого алфавитов собираете словарь. А по словарю уже изменяете нужный текст.
Firik
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))
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']
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
Firik
sl0wВашем же способом получается что то такое
большое спасибо, буду разбираться в вашем образце

я понял в чем вся путаница была: я ошибся в вычитании , потому как нумерация в списке идет с 0
JOHN_16
Вот к примеру решение достаточно простое, проверяющее границы
#!/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')
Vigi
Музыкой навеяло
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 != "|"]))
marvellik
добавлю свои пять копеек кода
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.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB