2015-03-06 2 views
2
se_eng_fr_dict = {'School': ['Skola', 'Ecole'], 'Ball': ['Boll', 'Ballon']} 

choose_language = raw_input("Type 'English', for English. Skriv 'svenska' fo:r svenska. Pour francais, ecrit 'francais'. ") 

if choose_language == 'English': 
    word = raw_input("Type in a word:") 
    swe_word = se_eng_fr_dict[word][0] 
    fra_word = se_eng_fr_dict[word][1] 
    print word, ":", swe_word, "pa. svenska," , fra_word, "en francais." 

elif choose_language == 'Svenska': 
    word = raw_input("Vilket ord:") 
    for key, value in se_eng_fr_dict.iteritems(): 
     if value == word: 
      print key 

Я хочу создать словарь (который будет храниться локально как файл txt), и пользователь может выбрать между вводом слова на английском, шведском или французском языке, чтобы получить перевод слова в два других языка. Пользователь также должен иметь возможность добавлять данные в словарь.3-х язычный словарь

Код работает, когда я смотрю на шведское и французское слово с английским словом. Но как я могу получить ключ и Value2, если у меня есть только значение1? Есть ли способ или я должен попытаться подойти к этой проблеме по-другому?

+0

Что вы подразумеваете под значением1 и значением2? – Kasramvd

+0

value1 = первое значение в словаре (в данном случае Skola или Boll) и value2 = второе значение в словаре (Ecole, Ballon) – Lovisa

+0

Просто вы можете перебирать словарные слова: '>>> se_eng_fr_dict = {'School ': [' Skola ',' Ecole '],' Ball ': [' Boll ',' Ballon ']} >>> val =' Skola ' >>> для i, j в файле se_eng_fr_dict.items(): ... если J [0] == Вал: ... печать я ... печать J ... Школа [ 'Скол', 'Ecole'] ' – Kasramvd

ответ

0

Хорошим вариантом было бы хранить None для значения, если оно не было установлено. Хотя это увеличит объем требуемой памяти, вы можете сделать еще один шаг и добавить сам язык.

Пример:

se_eng_fr_dict = {'pencil': {'se': None, 'fr': 'crayon'}} 

def translate(word, lang): 
    # If dict.get() finds no value with `word` it will return 
    # None by default. We override it with an empty dictionary `{}` 
    # so we can always call `.get` on the result. 
    translated = se_eng_fr_dict.get(word, {}).get(lang) 

    if translated is None: 
     print("No {lang} translation found for {word}.format(**locals())) 
    else: 
     print("{} is {} in {}".format(word, translated, lang)) 

translate('pencil', 'fr') 
translate('pencil', 'se') 
0

Может быть множество вложенных списков было бы лучше для этого:

>>> my_list = [ 
    [ 
     "School", "Skola", "Ecole" 
    ], 
    [ 
     "Ball", "Boll", "Ballon" 
    ] 
] 

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

>>> position = [index for index, item in enumerate(my_list) for subitem in item if value == subitem][0] 

Это возвращает индекс списка, который вы можете захватить:

>>> sub_list = my_list[position] 

И подсписщик будет иметь все переводы по порядку.

Например:

>>> position = [index for index, item in enumerate(my_list) for subitem in item if "Ball" == subitem][0] 
>>> print position 
1 
>>> my_list[position] 
['Ball', 'Boll', 'Ballon'] 
+1

Спасибо! Да, я думаю, что это сделало бы вещи немного легче. Я действительно хотел, чтобы словарь работал! – Lovisa

+0

Да, словарь может работать, но упорядоченный набор списков упорядочен, и вам не нужно беспокоиться о извлечении ключей из значений (словари отлично подходят для ввода значения, а не значения для ключа). Вложенные списки решают эту проблему. –

0

я надеюсь, что может быть лучшим решением, но вот мое:

class Word: 
    def __init__(self, en, fr, se): 
     self.en = en 
     self.fr = fr 
     self.se = se 

    def __str__(self): 
     return '<%s,%s,%s>' % (self.en, self.fr, self.se) 

тогда сваливать все эти Word S в структуру отображения данных. Вы можете использовать словарь, но здесь, если у вас есть огромный набор данных, это лучше для вас, чтобы использовать BST, взглянуть на https://pypi.python.org/pypi/bintrees/2.0.1

позволяет сказать, у вас есть все эти Word заряжено в списке с именем words, затем:

en_words = {w.en: w for w in words} 
fr_words = {w.fr: w for w in words} 
se_words = {w.se: w for w in words} 

еще раз, BST рекомендуется здесь.

0

Чтобы ускорить поиск слов и добиться хорошей гибкости, я бы выбрал словарь субдизайнеров: каждый подзадач переводит слова языка на все доступные языки, а словарь верхнего уровня отображает каждый язык в соответствующий subdictionary.

Например, если multidict это словарь верхнего уровня, а затем возвращает multidict['english']['ball'] (суб) словарь:

{'english':'ball', 'francais':'ballon', 'svenska':'ball'} 

Ниже приведен класс Multidictionary реализации такой идеи. Для удобства он предполагает, что все переводы сохраняются в текстовый файл в формате CSV, который считывается во время инициализации, например.:

english,svenska,francais,italiano 
school,skola,ecole,scuola 
ball,boll,ballon,palla 

В CSV-файл можно легко добавить любое количество языков.

class Multidictionary(object): 

    def __init__(self, fname=None): 
     '''Init a multidicionary from a CSV file. 
      The file describes a word per line, separating all the available 
      translations with a comma. 
      First file line must list the corresponding languages. 

      For example: 
      english,svenska,francais,italiano 
      school,skola,ecole,scuola 
      ball,boll,ballon,palla 
     ''' 
     self.fname = fname 
     self.multidictionary = {} 
     if fname is not None: 
      import csv 
      with open(fname) as csvfile: 
       reader = csv.DictReader(csvfile) 
       for translations in reader: 
        for lang, word in translations.iteritems(): 
         self.multidictionary.setdefault(lang, {})[word] = translations 

    def get_available_languages(self): 
     '''Return the list of available languages.''' 
     return sorted(self.multidictionary) 

    def translate(self, word, language): 
     '''Return a dictionary containing the translations of a word (in a 
      specified language) into all the available languages. 
     ''' 
     if language in self.get_available_languages(): 
      translations = self.multidictionary[language].get(word) 
     else: 
      print 'Invalid language %r selected' % language 
      translations = None 
     return translations 

    def get_translations(self, word, language): 
     '''Generate the string containing the translations of a word in a 
      language into all the other available languages. 
     ''' 
     translations = self.translate(word, language) 
     if translations: 
      other_langs = (lang for lang in translations if lang != language) 
      lang_trans = ('%s in %s' % (translations[lang], lang) for lang in other_langs) 
      s = '%s: %s' % (word, ', '.join(lang_trans)) 
     else: 
      print '%s word %r not found' % (language, word) 
      s = None 
     return s 


if __name__ == '__main__': 
    multidict = Multidictionary('multidictionary.csv') 
    print 'Available languages:', ', '.join(multidict.get_available_languages()) 
    language = raw_input('Choose the input language: ') 
    word = raw_input('Type a word: ') 
    translations = multidict.get_translations(word, language) 
    if translations: 
     print translations 
Смежные вопросы