Изменения в верхнем или нижнем регистре гласные в [0,1,2,3,4], соответственно и остальное то же


Цель была следующая должна быть решена в Python:

Дана строка, деф функцию, которая возвращает другую строку с гласными (в верхнем или нижнем регистре) заменить 0,1,2,3,4 соответственно.


Пример входных данных:

"bB nN aei ou AEIOU"

Желаемый Результат:

"bB nN 012 34 01234"

Это на самом деле довольно тривиально и может быть решена несколькими способами, один из способов может быть таким:

def crypt(s):
    vow = ["a","e","i","o","u"]
    stringL = []

    for x in s:
        if x in vow or x.lower() in vow:
            stringL.append(str(vow.index(x.lower())))
        else:
            stringL.append(x)

    return "".join(stringL)

Мне сказали, что это слишком сложное для такой простой задачи, что такой код трудно отлаживать и т. д.

Вы считаете такой подход "плохой", который как бы вам вместо этого пошел, это непонятно?



2006
10
задан 30 апреля 2011 в 12:04 Источник Поделиться
Комментарии
4 ответа

Используйте строку.maketrans().

from string import maketrans 

input = "aeiouAEIOU"
output = '0123401234'
trans = maketrans(input,output)
str = 'This is a Q&A site, not a discussiOn forUm, so please make sure you answer the question.'
print str.translate(trans)

Выход:

Th2s 2s 0 Q&0 s2t1, n3t 0 d2sc4ss23n f3r4m, s3 pl10s1 m0k1 s4r1 y34 0nsw1r th1 q41st23n.

13
ответ дан 30 апреля 2011 в 01:04 Источник Поделиться

Вызовы append, индекс, присоединяйтесь, ул. просто шум.

Здесь та же идея, но с картой и генератор выражение:

def crypt(s):
m = {"A": "0", "E": "1", "I": "2", "O": "3", "U": "4"}
return "".join(m[c.upper()] if c.upper() in m else c for c in s)

Это немного менее шумным.

6
ответ дан 30 апреля 2011 в 12:04 Источник Поделиться

Еще один способ сделать это, используя утиной типизацией.

def crypt(s):
LUT = {"A": "0", "E": "1", "I": "2", "O": "3", "U": "4"}
ns = ""
for x in s:
try:
ns += LUT[x.upper()]
except KeyError:
ns += x
return ns


Только ради этого я решил запустить каждый метод, представленный здесь на 100000 циклов в раз все.

Результаты были интересные, learnCodes был самый быстрый, длинный выстрел.

    mine 1.431309

ribby 1.314431

pat 0.631507

learnCode 0.124485


#my method
def crypt(s):
LUT = {"A": "0", "E": "1", "I": "2", "O": "3", "U": "4"}
ns = ""
for x in s:
try:
ns += LUT[x.upper()]
except:
ns += x
return ns

#ribbys method
def crypt2(s):
m = {"A": "0", "E": "1", "I": "2", "O": "3", "U": "4"}
return "".join(m[c.upper()] if c.upper() in m else c for c in s)

#pats method
def crypt3(s):
substitutions = {
'a' : '0',
'e' : '1',
'i' : '2',
'o' : '3',
'u' : '4',
'A' : '0',
'E' : '1',
'I' : '2',
'O' : '3',
'U' : '4'
}
for before, after in substitutions.items():
s = s.replace(before, after)
return s

#learnCodes method
from string import maketrans
def crypt4(s):
input = "aeiouAEIOU"
output = '1234512345'
trans = maketrans(input,output)
return s.translate(trans)

import timeit
print "volting %f" %timeit.Timer("crypt('bB nN aei ou AEIOU')", "from __main__ import crypt").timeit(100000)
print "ribby %f" %timeit.Timer("crypt2('bB nN aei ou AEIOU')", "from __main__ import crypt2").timeit(100000)
print "pat %f" %timeit.Timer("crypt3('bB nN aei ou AEIOU')", "from __main__ import crypt3").timeit(100000)
print "learnCode %f" %timeit.Timer("crypt4('bB nN aei ou AEIOU')", "from __main__ import crypt4").timeit(100000)

3
ответ дан 30 апреля 2011 в 12:04 Источник Поделиться

Я думаю, что в этом случае тебе лучше просто писать сопоставление -- есть только десять букв/цифр пар, и написание кода для создания такого сопоставления не покупать вам много.

def crypt(s):
substitutions = {
'a' : '0',
'e' : '1',
'i' : '2',
'o' : '3',
'u' : '4',
'A' : '0',
'E' : '1',
'I' : '2',
'O' : '3',
'U' : '4'
}

for before, after in substitutions.items():
s = s.replace(before, after)

return s

Если бы вы писали более общего транслитерации инструмент, скажем, с более сложными подмена правил, то ситуация была бы иной. Это весело, чтобы придумать аккуратные способы построения карт... например:

substitutions = dict(zip('aeiou','01234') + zip('AEIOU', '01234'))

Милый, разве это не ... ты будешь ненавидеть себя за пару недель (или дней!) когда кто-то приходит с "и иногда у!!!", да?

Учитывая небольшой масштаб постановки задачи, я бы сказал просто выплюнуть сопоставление и покончим с этим.

2
ответ дан 30 апреля 2011 в 02:04 Источник Поделиться