Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Помогите с одним "школьным" заданием на Python

697  1 2 все
Kot_Basilio
местный житель11.10.20 12:12
11.10.20 12:12 

Доброе утро,


я сижу над заданием по программированию на 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 
samowar
знакомое лицо11.10.20 13:58
NEW 11.10.20 13:58 
в ответ Kot_Basilio 11.10.20 12:12

Интересно, сколько времени на это отводится?

1- консоль тут не при чем, речь про аргументы командной строки.

2- лень писать все буквы, допишите сами. возможны баги, тестируйте.

3- судя по тестовому файлу дело происходит в чем-то юниксообразном. файл можно сделать исполняемым и прямо запустить.


декодировку можно сделать для красоты через dict (типа через ключ в {"A":2, "B":3, "C":None ....}), например, но вряд ли это будет короче.









#2 
Kot_Basilio
местный житель11.10.20 14:32
NEW 11.10.20 14:32 
в ответ samowar 11.10.20 13:58, Последний раз изменено 11.10.20 14:59 (Kot_Basilio)

Большое спасибо за ответ. Буду разбираться.

С коммандной строкой работаетю


Только не могу понять, как с консоли то же самое запустить и передать арнументы:




#3 
samowar
знакомое лицо11.10.20 14:59
NEW 11.10.20 14:59 
в ответ Kot_Basilio 11.10.20 14:32

как в задании и написано:


./similar.py soundeggs anyword etc


ну или


python3 ./similar.py soundeggs anyword etc anotherword


но не до бесконечности, максимальная длина командной строки ограничена. Раньше было сколько-то там килобайт, нынче вроде речь идет про мегабайты. Зависит от ОС.


#4 
Kot_Basilio
местный житель11.10.20 15:16
NEW 11.10.20 15:16 
в ответ samowar 11.10.20 14:59

В коммандной строке работает, а на консоле никак:



#5 
samowar
знакомое лицо11.10.20 15:24
NEW 11.10.20 15:24 
в ответ Kot_Basilio 11.10.20 15:16

./ - это под линукс (как следовало из описания тестового файла в самом задании), в винде же надо убирать.

#6 
uscheswoi_82
постоялец11.10.20 15:27
NEW 11.10.20 15:27 
в ответ Kot_Basilio 11.10.20 15:16, Последний раз изменено 11.10.20 15:30 (uscheswoi_82)

Вот тут гляньте https://translate.google.com/translate?sl=en&tl=ru&u=https... в Run -> Configure -> Command line options

А вообще щас все тут код пишут https://repl.it/languages/python3 я не знаю платная или нет, я часто там программирую.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнении Моя ФЛ Он и Она
#7 
Kot_Basilio
местный житель11.10.20 15:28
NEW 11.10.20 15:28 
в ответ samowar 11.10.20 15:24

Да я и так и сяк пробовал, всё равно invalid syntax...



#8 
AlexNek
патриот11.10.20 16:17
AlexNek
NEW 11.10.20 16:17 
в ответ Kot_Basilio 11.10.20 12:12

Имейте в виду что вам нужно написать две программы на основе одного и того же алгоритма

В примере который вам дали имеется ошибка, которою вы свободно найдете.

Задание написано не очень правильно, читать до понятия нужно фиг знает сколько раз


Метод 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

  1. soundex : s53200
  2. soundeggs : s53200
  3. flurbel : f46140


Напишите программу с именем similar, для которой требуется слово и (необязательное) имя файла.

  • Из файла считываются все слова
  • и выводятся слова, похожие на первый аргумент после процедуры Soundex.

Проверьте программу с помощью файла/usr/share/dict/, что также является значением по умолчанию. Учитывайте только слова, состоящие исключительно из букв ASCII.

#9 
Kot_Basilio
местный житель11.10.20 16:37
NEW 11.10.20 16:37 
в ответ AlexNek 11.10.20 16:17

Я отредактировал код (добавил нехватающих комбинаций из букв) и добавил комментарии, чтобы было яснее происходящее.

Теперь буду пытаться вторую часть сделать.


#10 
samowar
знакомое лицо11.10.20 16:44
NEW 11.10.20 16:44 
в ответ AlexNek 11.10.20 16:17

Действительно, проглядел что требуется две немного разные программы. Но почему регистр вы выделили жирным? Аж заинтриговало. Ошибочку то я вижу, но она с регистром не связана.

#11 
AlexNek
патриот11.10.20 17:16
AlexNek
NEW 11.10.20 17:16 
в ответ samowar 11.10.20 16:44, Последний раз изменено 11.10.20 17:18 (AlexNek)
Но почему регистр вы выделили жирным? Аж заинтриговало

Для ТС, чтобы не пропустил/понял зачем upper()

#12 
Kot_Basilio
местный житель11.10.20 17:20
NEW 11.10.20 17:20 
в ответ AlexNek 11.10.20 17:16

Чтобы все буквы большими стали, правильно?


#13 
AlexNek
патриот11.10.20 18:05
AlexNek
NEW 11.10.20 18:05 
в ответ Kot_Basilio 11.10.20 17:20
Чтобы все буквы большими стали, правильно?

Да правильно. Только не совсем понятно, что делать с регистром 1й буквы. По идее она тоже должна быть всегда "большой".

#14 
AlexNek
патриот11.10.20 18:13
AlexNek
NEW 11.10.20 18:13 
в ответ Kot_Basilio 11.10.20 15:16

А зачем еще что то устанавливать?

https://www.jdoodle.com/python3-programming-online/

#15 
Murr
патриот11.10.20 20:09
Murr
NEW 11.10.20 20:09 
в ответ samowar 11.10.20 13:58
декодировку можно сделать для красоты через dict

-----

Декодеровку, для скорости, нужно делать через статический массив вида:

code['A'] = 2...

code['a'] = 2...

code['B'] = 3...

etc.

Заодно исключаются вопросы upper/lower...


#16 
Kot_Basilio
местный житель11.10.20 20:16
NEW 11.10.20 20:16 
в ответ AlexNek 11.10.20 18:05
Только не совсем понятно, что делать с регистром 1й буквы. По идее она тоже должна быть всегда "большой".


Не обязательно, в задании тоже первая буква маленькая использована.


#17 
NightWatch
коренной житель11.10.20 21:05
NightWatch
NEW 11.10.20 21:05 
в ответ Kot_Basilio 11.10.20 15:28, Последний раз изменено 11.10.20 21:20 (NightWatch)

В python выполнение кода непосредственно из файла производится функцией execfile. В python 3 функцию убрали. Используется альтернатива: exec(open(filename).read()).

Spyder может запускать скрипты (также и с аргументами) самостоятельно. См. Run > Configuration per file


#18 
AlexNek
патриот11.10.20 21:17
AlexNek
NEW 11.10.20 21:17 
в ответ Kot_Basilio 11.10.20 20:16
Не обязательно, в задании тоже первая буква маленькая использована.

Да, но фамилия не пишется с маленькой буквы.

#19 
samowar
знакомое лицо12.10.20 09:52
NEW 12.10.20 09:52 
в ответ Murr 11.10.20 20:09, Последний раз изменено 12.10.20 10:07 (samowar)
Декодеровку, для скорости, нужно делать через статический массив вида:
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). Получится код практически как в С.

#20 
Kot_Basilio
местный житель12.10.20 19:31
NEW 12.10.20 19:31 
в ответ Kot_Basilio 11.10.20 16:37

Вот и вторая часть. Может и не изящно, но работает.


Большое спасибо всем за помощь.


#21 
  moose
коренной житель12.10.20 21:31
NEW 12.10.20 21:31 
в ответ Murr 11.10.20 20:09, Последний раз изменено 12.10.20 22:37 (moose)
нужно делать через статический массив вида:

а что за херня "статический массив" в python? что я проспал? или снова коту делеть нехер, и он яйца чешет/лижет? чеширский однако...

#22 
1 2 все