Словарь работает для len (строка), кратного 3. Функция удаляет остатки, но теперь не переводится со словарем.Python 2.7.1 - PullRequest
0 голосов
/ 11 ноября 2011

Я сделал функцию со словарем. Назначение функции - разделить входную строку на наборы по 3. Если значение входной строки не кратно 3, я хочу удалить остаток [1 или 2]

моя функция работала отлично, пока я не добавил часть для удаления остатков

def func(fx):
    d={'AAA':1,'BBB':2,'CCC':3}
    length=len(fx)
    if length % 3 == 0:
        return fx
    if length % 3 == 1:
        return fx[:-1]
    if length % 3 == 2:
        return fx[:-2]
    Fx=fx.upper()
    Fx3=[Fx[i:i+3] for i in range(0,len(Fx),3)]
    translate=[d[x] for x in Fx3]
    return translate


x='aaabbbcc'

output = func(x)

print output

>>>
aaabbb

функция распознает, что входная последовательность не кратна 3, поэтому она удаляет 2 значения, что я и хочу. Тем не менее, это разделение новой строки на 3 буквенных слова, которые будут переведены с моим словарем больше. Если вы удалите операторы if, функция будет работать, но только для строк, кратных 3.

Что я делаю не так ???

Ответы [ 3 ]

1 голос
/ 11 ноября 2011

Вы возвращаете FX, когда вам, вероятно, следует переназначить его

def func(fx):
    d={'AAA':1,'BBB':2,'CCC':3}
    length=len(fx)
    if length % 3 == 0:
        pass
    elif length % 3 == 1:
        fx = fx[:-1]
    elif length % 3 == 2:
        fx = fx[:-2]
    Fx=fx.upper()
    Fx3=[Fx[i:i+3] for i in range(0,len(Fx),3)]
    translate=[d[x] for x in Fx3]
    return translate

Вот альтернативная функция для вас, чтобы узнать, когда вы знаете еще немного Python

def func(fx):
    d = {'AAA':1,'BBB':2,'CCC':3}
    return [d["".join(x).upper()] for x in zip(*[iter(fx)]*3)]
0 голосов
/ 11 ноября 2011

Функция не нужна, ее можно выполнить на один слой менее сложный, чем у гибнибера.
Решение Acom почти мое.

d={'AAA':1,'BBB':2,'CCC':3}

for fx in ('bbbcccaaabbbcccbbbcccaaabbbcc',
           'bbbcccaaabbbaaa','bbbcccaaabbbaa','bbbcccaaabbba',
           'bbbcccaaabbb','bbbcccaaabb','bbbcccaaab',
           'bbbcccaaa','bbbcccaa','bbbccca',
           'bbbccc','bbbcc','bbbc',
           'bbb','bb','b',''):
    print fx
    print tuple( d[fx[i:i+3].upper()] for i in xrange(0, len(fx)-len(fx)%3, 3) )

производит

bbbcccaaabbbcccbbbcccaaabbbcc
(2, 3, 1, 2, 3, 2, 3, 1, 2)
bbbcccaaabbbaaa
(2, 3, 1, 2, 1)
bbbcccaaabbbaa
(2, 3, 1, 2)
bbbcccaaabbba
(2, 3, 1, 2)
bbbcccaaabbb
(2, 3, 1, 2)
bbbcccaaabb
(2, 3, 1)
bbbcccaaab
(2, 3, 1)
bbbcccaaa
(2, 3, 1)
bbbcccaa
(2, 3)
bbbccca
(2, 3)
bbbccc
(2, 3)
bbbcc
(2,)
bbbc
(2,)
bbb
(2,)
bb
()
b
()

()

.

Я думаю, что вам нужно обрабатывать строки, которые могут содержать только 3 символа: строки 'aaa', 'bbb', 'ccc' в позициях 0,3,6,9 и т. Д.
Тогда предыдущие программы не будут аварийно завершать работу, если в одной из этих позиций вместо одной из этих групп установлено aaa, bbb, ccc '

гетерогенная 3-символьная строка. В этом случае обратите вниманиечто вы можете использовать метод словаря get , который возвращает значение по умолчанию, когда аргумент с разделением на части не является ключом словаря.

В следующем коде я поместил возвращаемое значение по умолчанию как0:

d={'AAA':1,'BBB':2,'CCC':3}

for fx in ('bbbcccaaa###bbbccc"""bbbcc',
           'bbb   aaabbbaaa','bbbccc^^^bbbaa','bbbc;;;aabbba',
           'bbbc^caaabbb',']]bccca..bb','bbb%%%aaab',
           'bbbcccaaa','bbb!ccaa','b@bccca',
           'bbbccc','bbbcc','bbbc',
           'b&b','bb','b',''):
    print fx
    print [d.get(fx[i:i+3].upper(), 0) for i in xrange(0, len(fx)-len(fx)%3, 3)]

производит

bbbcccaaa###bbbccc"""bbbcc
[2, 3, 1, 0, 2, 3, 0, 2]
bbb   aaabbbaaa
[2, 0, 1, 2, 1]
bbbccc^^^bbbaa
[2, 3, 0, 2]
bbbc;;;aabbba
[2, 0, 0, 2]
bbbc^caaabbb
[2, 0, 1, 2]
]]bccca..bb
[0, 3, 0]
bbb%%%aaab
[2, 0, 1]
bbbcccaaa
[2, 3, 1]
bbb!ccaa
[2, 0]
b@bccca
[0, 3]
bbbccc
[2, 3]
bbbcc
[2]
bbbc
[2]
b&b
[0]
bb
[]
b
[]

[]

Кстати, я предпочел создать кортеж вместо списка, потому что для вида неизменяемых объектов, которые в результате, я думаюлучше не создавать список

0 голосов
/ 11 ноября 2011

Делает ли это то, что вы хотите?

def func(fx):
    d = {'AAA': 1, 'BBB': 2, 'CCC': 3}

    fx = fx[:-(len(fx)%3)].upper()

    groups = [fx[i:i+3] for i in range(0, len(fx), 3)]

    translate = [d[group] for group in groups]

    return translate

x='aaabbbcc'

print func(x)

Обрезая конец строки, вы возвращали результат, когда хотели просто сохранить его в переменной или присвоить его обратно fx.

Вместо if .. elif с вы можете просто использовать результат длины по модулю 3.

...