Помогите с одним "школьным" заданием на Python
Доброе утро,
я сижу над заданием по программированию на Python и сильно туплю. Не программист я, работать программистом не собираюсь, а зачёт здвть надо. Большая просьба помочь.

Я вот начал здесь, но дальше не идёт. Хотя я Zahl1 задекларировал как String, выходит ошибка.
И можно ли организовать ввод через Console попроще? Я пока толь через функцию придумал.
import sys
#soundex dict (Übersetzungstabelle Buchstaben zu Zahlen)
sound_data = {
"BFPV": 1,
"CGJKQSXZ": 2,
"DT": 3,
"L":4,
"MN":5,
"R":6
}
print('Bitte geben Sie das Wort so ein: f_wort("hier steht Ihr Wort")')
#Eingabe des Wortes über die Console als Funktionsaufruf f_wort("....")
def f_wort(wort):
print(wort)
soundex=[]
soundex.append(wort[0])
print(soundex)
#Umwandlung Zahlen zu String
Zahl1=str(sound_data["BFPV"])
print(type(Zahl1))
print(Zahl1)
print(wort[1])
for position in wort:
if wort[position+1]=="B" or "F" or "P" or "V":
soundex.append(Zahl1)
print(soundex)
#elif wort[position+1]=="C" or "G" or "J" or "K" or "Q" or "S" or "X" or "Z"
Интересно, сколько времени на это отводится?
1- консоль тут не при чем, речь про аргументы командной строки.
2- лень писать все буквы, допишите сами. возможны баги, тестируйте.
3- судя по тестовому файлу дело происходит в чем-то юниксообразном. файл можно сделать исполняемым и прямо запустить.
декодировку можно сделать для красоты через dict (типа через ключ в {"A":2, "B":3, "C":None ....}), например, но вряд ли это будет короче.
как в задании и написано:
./similar.py soundeggs anyword etc
ну или
python3 ./similar.py soundeggs anyword etc anotherword
но не до бесконечности, максимальная длина командной строки ограничена. Раньше было сколько-то там килобайт, нынче вроде речь идет про мегабайты. Зависит от ОС.
Вот тут гляньте https://translate.google.com/translate?sl=en&tl=ru&u=https... в Run -> Configure -> Command line options
А вообще щас все тут код пишут https://repl.it/languages/python3 я не знаю платная или нет, я часто там программирую.
Моя ФЛ Он и ОнаИмейте в виду что вам нужно написать две программы на основе одного и того же алгоритма
В примере который вам дали имеется ошибка, которою вы свободно найдете.
Задание написано не очень правильно, читать до понятия нужно фиг знает сколько раз
Метод Soundex был использован в США для группировки данных переписи по похоже звучащим фамилиям (то же значение Soundex),
чтобы поиск английских слов проходил с игнорированием возможных ошибок в записи фамилии.
Значение Soundex для слова вычисляется, как показано в следующей таблице, где
- первой буквой значения Soundex является первая буква слова.
Последующие буквы
BFPV -1
CGJKQSXZ -2
DT - 3
L - 4
MN - 5
R - 6
AEIOUWYH – игнор
- Каждая последующая буква (независимо от регистра) преобразуется в цифру или игнорируется на основе предыдущей таблицы.
- Если цифра Soundex равна предыдущей, она игнорируется.
- Значение Soundex не может превышать 6 символов, дополнительные символы игнорируются. Если значение Soundex меньше 6 символов, значение Soundex заполняется цифрой 0.
Напишите программу Python soundex, которая принимает любое количество слов в качестве параметров командной строки и вычисляет значение Soundex для каждого слова. Пример:
soundex.py soundex soundeggs flurbel
- soundex : s53200
- soundeggs : s53200
- flurbel : f46140
Напишите программу с именем similar, для которой требуется слово и (необязательное) имя файла.
- Из файла считываются все слова
- и выводятся слова, похожие на первый аргумент после процедуры Soundex.
Проверьте программу с помощью файла/usr/share/dict/, что также является значением по умолчанию. Учитывайте только слова, состоящие исключительно из букв ASCII.
Я отредактировал код (добавил нехватающих комбинаций из букв) и добавил комментарии, чтобы было яснее происходящее.
Теперь буду пытаться вторую часть сделать.
Декодеровку, для скорости, нужно делать через статический массив вида:
code['A'] = 2...
code['a'] = 2...
code['B'] = 3...
etc.
Заодно исключаются вопросы upper/lower..
Да, конечно, по скорости статический массив не уделать, на С вероятно было бы даже читабельней.
Но питон язык с особенностями. Статический массив в питоне это tuple и string, но статичны они не только по размеру, но и содержанию - immutable. Инициализируются они в момент создания, после изменить значения элементов нельзя. Но под статичным вы очевидно подразумеваете инициализируемый только один раз, так что возьмем обычный list (динамический).
C массивом (не важно, list/tuple/string, есть и другие, импортируемые, массивы) есть проблемка с индексом. byte / char / uint8 - в питоне это не одно и то же, и неявной подстановки "A" в 0x41 например в питоне делаться не будет. Это значит индексировать массив буквами не получится, конвертировать букву в индекс нужен явный вызов ord(). И это еще не все - строки (а значит и буквы - строки единичной длины) в питоне могут быть однобайтовыми (ascii) и многобайтовыми (уникодными), тут могут возникать нюансы (особенно в третьем питоне, в котором строка по умолчанию уникодная). Не зря в условии задачи явно оговорено что кодировка ascii.
dict в этом плане проще и наглядней. То, что вы написали и есть питоновский синтаксис присвоения значения элементам dict, с list такое не пройдет. Среднее время поиска значения в dict - О(1), как и у массива, в худшем случае правда О(n) против О(1).
Понятно что даже и в лучшем для dict случае посчитать индекс в массиве (сложить два числа и вернуть число по адресу) проще и быстрее чем искать ключ в dict, и абсолютное времена при сложности О(1) и О(1) не одно и тоже.
Так что взять массив для скорости и можно, но тогда уж и строки сразу исходно как байтовые (конвертировать в bytestring). Получится код практически как в С.
Вот и вторая часть. Может и не изящно, но работает.
Большое спасибо всем за помощь.




