2016-04-18 2 views
0

Цель: создать класс python, который примет пример строки «maple» и перевести его в соответствующий код вида «AC».Работа с большими словарями в python? (производительность и сбой)

Проблема: Я создал словарь, содержащий все вводы строк и соответствующий им код вида, который будет использоваться для перевода. Однако я не могу понять, как реализовать словарь без сбоев python. Словарь довольно большой (примерно 4000 записей в формате: {'common name example1': 'species code example1', 'common name example2':'species code example2', ... }, как показано ниже. Я думаю, что мой код работает теоретически, но он занимает такой большой объем памяти, что python продолжает сбой.

Вот мой код :

import string 

class exportSpec: 

    def __init__(self, exportSpecobj): 
     self.set(self.sani(exportSpecobj)) 
    def get(self): 
     return self.exportSpecobj 
    def set(self, exportSpecobj_pre_sani): 
     self.exportSpecobj = exportSpecobj_pre_sani 

    def puncremove(self, common): 
     for c in string.punctuation: 
     common = common.replace(c,"") 
    return common 

    def lower(self, common): 
     common = self.lower() 
     return common 

    def codeChange(self, saniCode): 
     codeDict = {'balsam fir':'ABBA', 'white fir':'ABCO', 'maple':'AC', 'freeman maple':'ACFR', 'amur maple':'ACGI', 'rocky mountain maple':'ACGL', 'boxelder':'ACNE', 'norway maple':'ACPL', 'red maple':'ACRU', 'silver maple':'ACSA1', 'sugar maple':'ACSA2', 'tatar maple':'ACTA', 'ohio buckeye':'AEGL', 'horsechestnut':'AEHI', 'serviceberry':'AM', 'broadleaf deciduous large':'BDL OTHER', 'broadleaf deciduous medium':'BDM OTHER', 'broadleaf deciduous small':'BDS OTHER'} 

# the dictionary^^ is much bigger but I just showed the first 20ish values to show my code 

    check = codeDict.has_key(saniCode) 
     if check == "True": 
      print("New code was found") 
      return codeDict[saniCode] 
     else: 
      print("Error finding code in Dictionary") 
      print(saniCode) 
      output = 0 
      return output 

    def sani(self, exportSpecObj): 
     if exportSpecObj is None: 
      output = 0 
      return output 
     else: 
      exportSpecObjlcpr = self.lower(self.puncremove(exportSpecObj)) 
      saniCode = codeChange(exportSpecObjlcpr) 
      return saniCode 

так что я думаю, что мой код работает теоретически вход приходит и получает продезинфицировать с методами ниже и puncremove, чтобы удалить знаки препинания и перевести в нижний регистр, так что вход может быть найден в словаре должны быть возвращены. как значение, найденное в словаре из ввода ключа.

Если есть более простой способ сделать это, не используя словарь, который тоже будет работать, но это, казалось, было единственным способом, который я мог придумать для этого. Общие имена и соответствующие коды видов были первоначально сохранены в файле excel, и я создал словарь из этого.

У меня просто нет опыта работы с кодированием вне классной комнаты и мало что нужно знать о памяти и производительности программ. Любая помощь очень ценится. Спасибо.

+2

Вы можете скопировать и вставить StackTrace, что вы получаете, когда аварии питона в ваш вопрос, пожалуйста? – snakecharmerb

+0

Прямо сейчас это дает мне SyntaxError: непоследовательное использование вкладок и пробелов в отступе. Как я могу найти stacktrace между прочим. Извинения за неопытность. Python работает очень медленно, когда я пытаюсь объявить класс. –

+0

Трассировка начинается с: 'Traceback (последний последний вызов):' и заканчивается тем исключением, которое вы видите, - 'SyntaxError' в вашем случае. – snakecharmerb

ответ

Смежные вопросы