Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2021, 16:21   #1
baitle
 
Регистрация: 24.07.2021
Сообщений: 5
По умолчанию словарь не работает, почему?

Здравствуйте, я совсем новичок в python.
Решил попробовать себя на конкретной задаче словарь англо-русский. Взял за основу вот эту публикацию https://www.unix-lab.org/posts/pydict/ - пример второй. Создал 3 файла, которые сохранил в пайтон директории:
1)База данных words_db
Код:
# words_db.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import shelve
db = shelve.open('db_file')
db['earth']='земля'
db['word']='слово'
db['catch']='ловить'
db['find']='искать'
db['you']='ты'
db['I']='я'
db['We']='мы'
db['probably']='вероятно'
db['piece']='кусок'
db['tired']='усталый'
db['should']='должен'
db['be able']='быть в состоянии'
db['not enough']='не хватает'
db['enough']='достаточно'
db['should']='должен'
db['represent']='представлять'
db['sequence']='последовательность'
db.close()
2)Восстановление базы данных из файла db_file

Код:
# dump_words_db.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import shelve
db=shelve.open('db_file')
print('Yes')
3)Главный файл, запускающий функции start_programm
Код:
# start_programm.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import shelve
db=shelve.open('db_file')

def eng():
eng_words=dict([ for k,v in db.items()])
find_word=input('Enter word ‘ ’')
print(eng_words.get(find_word) or print('No such key'))

def rus():
key=input('Введите слово ‘ ’')
print (db.get(key) or ‘Искомое слово не найдено’)

def newRecord():
newkey=input('Ввести новое слово ‘ ’')
newvalue=input('Ввести перевод ‘ ’')
db = newvalue
db.update()
db.close()

if __name__ == ‘__main__’:
start=input('Найти английский перевод русского слова? введите “y” или “n” ‘ ’')
if start == ‘y’:
eng()
elif start == ‘n’:
rus()
elif start == ‘u’:
newRecord()
else:
print('До встречи')
Короче, запускаю 3 файл f5 и все что я вижу
=================== RESTART: E:\Python3.81\start_programm.py ===================
Найти английский перевод русского слова? введите “y” или “n” n
Введите слово ‘земля’
Искомое слово не найдено
>>>
=================== RESTART: E:\Python3.81\start_programm.py ===================
Найти английский перевод русского слова? введите “y” или “n” n
Введите слово ‘earth’
Искомое слово не найдено
>>>
=================== RESTART: E:\Python3.81\start_programm.py ===================
Найти английский перевод русского слова? введите “y” или “n” u
Ввести новое слово ‘love’
Ввести перевод ‘любовь’
>>>
по идее это новое слово должно записаться в базу данных words_db, но его там нету я проверял(((


=================== RESTART: E:\Python3.81\start_programm.py ===================
Найти английский перевод русского слова? введите “y” или “n” y
Enter word ‘earth’
No such key
None
>>>
Пробовал разные варианты - ответ No such key
None
Подскажите что я делаю не так?

Последний раз редактировалось baitle; 14.08.2021 в 22:21.
baitle вне форума Ответить с цитированием
Старый 14.08.2021, 20:41   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Это важно - это Python.
Если с кодом Си или Pascal немного проще, там есть операторные скобки ({} или begin end), то тут необходимо обязательно заключать код в тег CODE.

Выдели код в своей среде и Ctrl + C
Перейди в форму для ввода сообщения и Ctrl + V
Выдели вставленный код и нажми кнопку [CODE], над формой ввода.

А разбираться в этом борще ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 14.08.2021, 22:26   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Код:
def eng():
eng_words=dict([ for k,v in db.items()])
find_word=input('Enter word ‘ ’')
print(eng_words.get(find_word) or print('No such key'))
В Python такой код не будет запускаться.
В том числе и см. свои условные операторы.
Написано:
Выдели код в своей среде и Ctrl + C
Т.е., выдели исходный код и ...
А так, как сделано у тебя ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 14.08.2021, 22:41   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
# start_programm.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import shelve
db = shelve.open('db_file')
rus_words = dict((v, k) for k, v in db.items())

def eng():
    find_word = input('Enter word:')
    print(rus_words.get(find_word) or 'No such key')

def rus():
    find_word = input('Введите слово:')
    print(db.get(find_word) or 'Искомое слово не найдено')

def newRecord():
    newkey = input('Ввести новое слово:')
    newvalue = input('Ввести перевод:')
    db[newkey] = newvalue
    db.update()

if __name__ == '__main__':
    while True:
        start = input('Найти английский перевод русского слова? введите "y", "n" или "u":')
        if start == 'y':
            eng()
        elif start == 'n':
            rus()
        elif start == 'u':
            newRecord()
        else:
            print('До встречи')
            break
    db.close()
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 14.08.2021 в 22:44.
BDA вне форума Ответить с цитированием
Старый 16.08.2021, 09:23   #5
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

BDA, спасибо за форматирование, хотя это и не совсем код от ТС.
Возможно ТС и потерял интерес к своему вопросу, но ответ, на мой взгляд, нужен.

baitle, если всё ещё интересно (с исправлениями):
Код:
# start_programm.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import shelve
db = shelve.open('db_file', writeback = True)
# rus_words = dict((rus, eng) for eng, rus in db.items())

def rus2eng():
    rus_words = dict((rus, eng) for eng, rus in db.items())
    find_word = input('Введите слово:')
    print(rus_words.get(find_word) or 'Искомое слово не найдено')

def eng2rus():
    find_word = input('Enter word:')
    print(db.get(find_word) or 'No such key')

def newRecord():
    newkey = input('Ввести новое слово (eng):')
    newvalue = input('Ввести перевод (rus):')
    db[newkey] = newvalue
#    db.update()
    rus_words = dict((v, k) for k, v in db.items())

if __name__ == '__main__':
    while True:
        start = input('Rus to Eng - y\n'
                      'Eng to Rus - n\n'
                      'New word - u\n'
                      'Exit - Return\n')
        if start == 'y':
            rus2eng()
        elif start == 'n':
            eng2rus()
        elif start == 'u':
            newRecord()
        else:
            print('До встречи')
            break
    db.close()
1. Базу надо открывать с параметром writeback = True. В этом случае обновление сразу попадает в файл.
Если этот параметр игнорировать, то обновления сохраняются во вспомогательном стеке и только при закрытии файла сохраняются в нём.
В новой сессии файл будет содержать обновления.
2. Поскольку обновление вспомогательного словаря делалось из старого файла, то и обратный перевод не работал.
3. # db.update() - эта команда вроде как и ни к чему.
4. После вставки новой записи вспомогательный словарь так же надо обновлять: функция newRecord().

Этот код у меня работает.
Как-то так, ...

Последний раз редактировалось ViktorR; 16.08.2021 в 10:13. Причина: Подправил сообщения
ViktorR вне форума Ответить с цитированием
Старый 16.08.2021, 20:08   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

ViktorR, да, это уже был код не только с форматированием, но и с исправлениями. Но я действительно забыл согласовать newRecord с другими функциями. Однако, реализация 4 пункта не совсем верна. Вы просто в 2 функциях создаете 2 локальных словаря из db, а не обновляете. Скорее, нужно так:
Код:
db = shelve.open('db_file', writeback = True)
rus_words = dict((rus, eng) for eng, rus in db.items())

def rus2eng():
    find_word = input('Введите слово:')
    print(rus_words.get(find_word) or 'Искомое слово не найдено')
...
def newRecord():
    newkey = input('Ввести новое слово (eng):')
    newvalue = input('Ввести перевод (rus):')
    db[newkey] = newvalue
    rus_words[newvalue] = newkey
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 16.08.2021, 21:21   #7
baitle
 
Регистрация: 24.07.2021
Сообщений: 5
По умолчанию

Спасибо всем, кто помог разобраться, я очень благодарен ViktorR и BDA. Благодарен за то, что не погнушались моей недалекостью и все-таки откликнулись и помогли! Спасибо!!!
baitle вне форума Ответить с цитированием
Старый 17.08.2021, 08:46   #8
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

BDA
Цитата:
Скорее, нужно так:
Да! Так и надо было.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 17.08.2021, 22:48   #9
baitle
 
Регистрация: 24.07.2021
Сообщений: 5
По умолчанию

Остался для меня нерешенным вопрос, почему, я ввожу новые слова в idle но они не прописываются в моем файле словаря, однако при старте проги они где-то все-таки записались, так как программка их находит, вот где - я не понимаю.

=================== RESTART: E:\Python3.81\start_programm.py ===================
Найти английский перевод русского слова? введите "y" или "n" u
Ввести новое слово (eng):cat
Ввести перевод (rus):кошка
>>>
=================== RESTART: E:\Python3.81\start_programm.py ===================
Найти английский перевод русского слова? введите "y" или "n" y
Enter word кошка
cat
>>>
=================== RESTART: E:\Python3.81\start_programm.py ===================
Найти английский перевод русского слова? введите "y" или "n" u
Ввести новое слово (eng)og
Ввести перевод (rus):собака
>>>
=================== RESTART: E:\Python3.81\start_programm.py ===================
Найти английский перевод русского слова? введите "y" или "n" y
Enter word собака
dog
>>>
Код:
# words_db.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import shelve
db = shelve.open('db_file')
db['earth']='земля'
db['word']='слово'
db['catch']='ловить'
db['find']='искать'
db['world']='мир'
db['you']='ты'
db['I']='я'
db['we']='мы'
db['probably']='вероятно'
db['piece']='кусок'
db['tired']='усталый'
db['should']='должен'
db['be able']='быть в состоянии'
db['not enough']='не хватает'
db['enough']='достаточно'
db['represent']='представлять'
db['sequence']='последовательность'
db['star']='звезда'
db.close()
Вот сам словарь, где нет этих слов, может кто объяснит как это происходит?
Цитата:
Сообщение от BDA Посмотреть сообщение
ViktorR, да, это уже был код не только с форматированием, но и с исправлениями. Но я действительно забыл согласовать newRecord с другими функциями. Однако, реализация 4 пункта не совсем верна. Вы просто в 2 функциях создаете 2 локальных словаря из db, а не обновляете. Скорее, нужно так:
Код:
db = shelve.open('db_file', writeback = True)
rus_words = dict((rus, eng) for eng, rus in db.items())

def rus2eng():
    find_word = input('Введите слово:')
    print(rus_words.get(find_word) or 'Искомое слово не найдено')
...
def newRecord():
    newkey = input('Ввести новое слово (eng):')
    newvalue = input('Ввести перевод (rus):')
    db[newkey] = newvalue
    rus_words[newvalue] = newkey

Последний раз редактировалось baitle; 17.08.2021 в 22:55.
baitle вне форума Ответить с цитированием
Старый 17.08.2021, 22:58   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

baitle, ваш словарь на самом деле хранится в файле db_file (точнее, в двух файлах: db_file.dat и db_file.dir). Скрипт words_db.py создает базу данных и заполняет некоторой информацией. Когда вы в скрипте start_programm.py добавляете слово, то оно добавляется в базу данных, но не в скрипт инициализации words_db.py.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает gets вообще, ни один код не работает с gets, почему? Мaкс Общие вопросы C/C++ 4 26.07.2018 11:49
почему прсер работает на одних сайтах и не работает на других PHP_DELETANT PHP 4 12.02.2016 13:45
Здравствуйте ! в чем проблема,почему почему время исполнения операций не работает ? ion leahu Помощь студентам 6 23.11.2014 19:36
Почему программа на С++ не работает с локальным описанием массива, но работает с глобальным? >>STINGER<< Помощь студентам 4 08.03.2011 09:56
почему интеренет на Xp не работает, а на семерке работает Lenura Windows 18 04.10.2010 12:04