Слишком умный для своей собственной хорошей категории, и предполагается, что в строчном алфавите ровно одна пропущенная буква:
print chr(2847 - sum(map(ord, theString)))
[Изменить]
Я проверил несколько вариантов различных решений, чтобы увидеть, какие из них быстрее.
Моя практика оказалась довольно медленной (чуть быстрее, если я вместо этого использую itertools.imap).
Удивительно, но решение listcomp от monkut оказалось самым быстрым - я ожидал, что установленные решения будут работать лучше, так как каждый раз при поиске пропущенной буквы приходится сканировать список.
Я попытался сначала преобразовать список тестов в набор перед проверкой членства, ожидая, что это ускорит его, но на самом деле это сделало его медленнее. Похоже, что постоянная задержка фактора при создании заданного карлика снижает стоимость использования алгоритма O (n ** 2) для такой короткой строки.
Это говорит о том, что даже более базовый подход, использующий преимущество раннего выхода, мог бы работать еще лучше. Вот то, что я думаю, в настоящее время работает лучше всего:
def missing_letter_basic(s):
for letter in string.ascii_lowercase:
if letter not in s: return letter
raise Exception("No missing letter")
Однако метод деления пополам лучше всего подходит для работы с более крупными строками. Это только вычеркнуто списком comp здесь и имеет намного лучшую асимптотическую сложность, так что для строк, больших чем алфавит, это явно победит.
[Edit2]
На самом деле, немного обманывая, я могу стать еще лучше, злоупотребляя тем фактом, что нужно проверить только 26 строк, вот последний искатель пропущенных букв O (1)!
find_missing_letter = dict((string.ascii_lowercase[:i]+string.ascii_lowercase[i+1:],
string.ascii_lowercase[i]) for i in range(26)).get
>>> find_missing_letter('abcdefghijklmnoprstuvwxyz')
'q'
Вот мои тайминги (500000 прогонов, проверено на отсутствие букв в начале, середине и конце строки (b, m и y)
"b" "m" "y"
bisect : 2.762 2.872 2.922 (Phil H)
find_gap : 3.388 4.533 5.642 (unwind)
listcomp : 2.832 2.858 2.822 (monkut)
listcomp_set : 4.770 4.746 4.700 As above, with sourcelist=set(sourcelist) first
set_difference : 2.924 2.945 2.880 (Phil H)
sum : 3.815 3.806 3.868
sum_imap : 3.284 3.280 3.260
basic : 0.544 1.379 2.359
dict_lookup : 0.135 0.133 0.134