2015-01-31 3 views
0

Эта программа должна принять правила грамматики, найденные в Binary.text и хранить их в словарь, где правила:Словари перезапись в Python

N = N D 
N = D 
D = 0 
D = 1 

но текущий код возвращает D: D = 1, N: N = D, в то время как я хочу N: ND, N: D, D: 0, D: 1

import sys 
import string 

#default length of 3 
stringLength = 3 

#get last argument of command line(file) 
filename1 = sys.argv[-1] 


#get a length from user 
try: 
    stringLength = int(input('Length? ')) 
    filename = input('Filename: ') 
except ValueError: 
    print("Not a number") 

#checks 
print(stringLength) 
print(filename) 

def str2dict(filename="Binary.txt"): 
    result = {} 
    with open(filename, "r") as grammar: 
     #read file 
     lines = grammar.readlines() 
     count = 0 
     #loop through 
     for line in lines: 
      print(line) 
      result[line[0]] = line 
      print (result) 
    return result 

print (str2dict("Binary.txt")) 
+1

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

+0

Я знаю, что это проблема, как я могу сделать так, чтобы она не перезаписывалась и вместо этого создавала новую запись с тем же ключом? – FullCombatBeard

+0

Как выглядит ваш .txt-файл? – GLHF

ответ

1

словари, по определению, не может иметь дубликаты ключей. Для этого может быть только один ключ «D». Однако вы можете сохранить список значений по этому ключу, если хотите. Пример:

from collections import defaultdict 

# rest of your code... 

result = defaultdict(list) # Use defaultdict so that an insert to an empty key creates a new list automatically 
with open(filename, "r") as grammar: 
    #read file 
    lines = grammar.readlines() 
    count = 0 
    #loop through 
    for line in lines: 
     print(line) 
     result[line[0]].append(line) 
     print (result) 
return result 

Это приведет к чему-то вроде:

{"D" : ["D = N D", "D = 0", "D = 1"], "N" : ["N = D"]} 
+0

Это не ожидаемый выход OP. Он хочет дальше расколоться на символ «=». – SuperSaiyan

+0

Это было непонятно из их вопроса + кода (они конкретно заявили, что проблема заключалась в отсутствии дубликатов ключей, а не в формате значений), поэтому я оставил его, а не предполагал. Я просто решил проблему, которую они описали, а не дополнительные проблемы. – aruisdante

2

Во-первых, ваша структура данных выбора является неправильным. Словарь в python - это простое сопоставление «ключ-к-значению». Вам нужна карта от ключа до нескольких значений. Для этого вам понадобятся:

from collections import defaultdict 
result = defaultdict(list) 

Далее, где вы раскалываете на '='? Вам нужно будет сделать это, чтобы получить правильный ключ/значение, которое вы ищете? Вам нужно

key, value = line.split('=', 1) #Returns an array, and gets unpacked into 2 variables 

Положив выше двух вместе, вы бы идти о следующим образом:

result = defaultdict(list) 
with open(filename, "r") as grammar: 
    #read file 
    lines = grammar.readlines() 
    count = 0 
    #loop through 
    for line in lines: 
     print(line) 
     key, value = line.split('=', 1) 
     result[key.strip()].append(value.strip()) 
return result 
Смежные вопросы