Попытка изменить или интерпретировать код C в Python

Итак, я пытаюсь изменить код C на python. Я не знаю, как это сделать. Основная идея заключается в том, что я пытаюсь преобразовать букву AA в числовую кодировку (0-21)

Это то, что я пытался сделать

def annum(ch):
    const_aacvs = ['999','0','3','4','3','6','13','7','8','9','21','11','10','12','2','21','14','5','1','15','16','21','19','17','21','18','6']
    return(ch.isalpha() ? aacvs[ch & 30] : 20)

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

это исходный код из C

int annum(int ch){
    const static int accvs[] = {999, 0, 3, 4, 3, 6, 13, 7, 8, 9, 21, 11, 10, 12, 2, 21, 14, 5, 1, 15, 16, 21, 19, 17, 21, 18, 6};

    return(isalpha(ch) ? accvs[ch & 30] : 20)
}
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
0
47
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я вижу здесь три проблемы:

  1. В коде C accvs - это массив чисел. В коде Python const_aacvs - это массив строк, а имя переменной написано (неправильно) непоследовательно.

  2. Код C зависит от идентичности char как числового типа. Код Python ожидает, что ch будет строкой, но не предпринимает никаких шагов для преобразования ее в число перед использованием для индексации в const_aacvs. Используйте ord() для выполнения этого преобразования.

  3. В Python нет оператора ?:. Используйте a if c else b как тернар, но помните, что операнды идут в другом порядке.

def annum(ch):
    acvs = [999,0,3,4,3,6,13,7,8,9,21,11,10,12,2,21,14,5,1,15,16,21,19,17,21,18,6]
    return aacvs[ord(ch) & 30] if ch.isalpha() else 20

Это тоже не сработает. ch должен быть строкой для существования ch.isalpha, поэтому ch & 30 выдаст TypeError.

user149341 27.12.2018 05:22
Ответ принят как подходящий

Дело в том, что в Python нет такого же тернарного оператора.

condition?true:false => true if condition else false

Для реализации линии:

return(isalpha(ch) ? accvs[ch & 30] : 20)

в python вам нужно сделать следующее:

return (accvs[ord(ch) & 30] if ch.isalpha() else '20')

Другие вопросы по теме