Помогите с одним "школьным" заданием на 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 я не знаю платная или нет, я часто там программирую.
Meine Die Formel der LiebeИмейте в виду что вам нужно написать две программы на основе одного и того же алгоритма
В примере который вам дали имеется ошибка, которою вы свободно найдете.
Задание написано не очень правильно, читать до понятия нужно фиг знает сколько раз
Метод 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.
Действительно, проглядел что требуется две немного разные программы. Но почему регистр вы выделили жирным? Аж заинтриговало. Ошибочку то я вижу, но она с регистром не связана.
Но почему регистр вы выделили жирным? Аж заинтриговало
Для ТС, чтобы не пропустил/понял зачем upper()
Чтобы все буквы большими стали, правильно?
Да правильно. Только не совсем понятно, что делать с регистром 1й буквы. По идее она тоже должна быть всегда "большой".
-----
Декодеровку, для скорости, нужно делать через статический массив вида:
code['A'] = 2...
code['a'] = 2...
code['B'] = 3...
etc.
Заодно исключаются вопросы upper/lower...
Только не совсем понятно, что делать с регистром 1й буквы. По идее она тоже должна быть всегда "большой".
Не обязательно, в задании тоже первая буква маленькая использована.
Не обязательно, в задании тоже первая буква маленькая использована.
Да, но фамилия не пишется с маленькой буквы.
Декодеровку, для скорости, нужно делать через статический массив вида:
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). Получится код практически как в С.
нужно делать через статический массив вида:
а что за херня "статический массив" в python? что я проспал? или снова коту делеть нехер, и он яйца чешет/лижет? чеширский однако...




