2017-02-14 2 views
0

Мне пришлось сделать два словаря словарей из текстового файла. Они перечислены в числовом порядке в текстовом файле, от C00001 до C20990 (C означает соединение), однако, когда я иду печатать словари, все происходит беспорядочно, а не в числовом порядке. Как я могу это изменить? Кроме того, есть ли способ поставить двойную кавычку в левой части ключа, а другую двойную кавычку в правой части строки значений? И, отдельно, когда я пытаюсь напечатать его так, чтобы он имел новую строку для каждого ключа, он говорит мне, что у меня есть ключевая ошибка (специально для записи C20990.Я бы предположил, что это потому, что это последняя в словаре , но это будет только в том случае, если он уже был в числовом порядке, что это не так, так что это заставляет меня беспокоиться, что во время цикл в конце концов, это произойдет с большим количеством записей)Почему мой словарь не в цифровом порядке, и я могу изменить разделители?

import sys 
entries = [] 
names = [] 
a = {} #achiral 
c = {} #chiral 
for line in file: 
    if line.startswith("ENTRY"): 
     s = line[5:len(line)] 
     s = s.split() 
     entries.append(s[0]) 

    if line.startswith("NAME"): 
     s = line[4:len(line)] 
     s = s.strip() 
     st = "".join(s+" ") 

     line=next(file) 
     check = False 
     while not line.startswith("FORMULA") and not line[0].isalpha(): 
      s = line.strip() 
      if s.find("(R)")>=0: 
       check = True 
      if s.find("(S)")>=0: 
       check = True 
      if s.find("L-")>=0: 
       check = True 
      if s.find("D-")>=0: 
       check = True 
      st+=s+" " 
      line = next(file) 

     st = st.strip() 
     if not check: 
      a[entries[-1]] = st 
     else: 
      c[entries[-1]] = st 
     names = [] 
     st = "" 
for key in c: 
    print("{0}: {1}".format(key, c[entries[-1]])) 
+0

Вы можете использовать 'sortedDict' класс в http://www.grantjenks.com/docs/sortedcontainers/sorteddict.html – Barmar

ответ

0
  1. Когда я иду печатать словари, все выходит неаккуратно, а не в порядке нумерации. Как я могу это изменить?

    Python dictionary использует хеш-таблицу для индексации всех ключей неупорядоченным способом. Плюс, ключ, который вы используете, как C20990, является string, хотя вы можете легко извлечь цифры и преобразовать их в int.

    Я предлагаю вам сделать это, когда вы добавляете его к входу, а именно в первом if пункте, используйте

    s = s.split() 
    s = int(s[1:]) 
    

    и отсортировать ключи перед тем, распечатав запись

    for key in sorted(c.keys()): 
    
  2. Также , есть ли способ поставить двойную кавычку в левой части ключа, а другую двойную кавычку в правой части строки значений?

    Да, используйте output formatting.

  3. И, отдельно, когда я пытаюсь напечатать его так, чтобы он имел новую строку для каждой клавиши, он говорит мне, что у меня есть ключевая ошибка (специально для записи C20990).

    Вы используете c[entries[-1]], но эта запись может быть ахиральной и принадлежит к словарю a. Вместо этого вам нужно использовать ключи от c, см. Код в Q1.

+0

Я новичок в программировании, так что я предполагаю, что я не совсем получить то, что Я должен сделать для № 3. Вы можете объяснить? – Kevin

+0

@Kevin Вы можете печатать словарь 'c' и' a' отдельно, используя метод в ответе @Hesham Attia. И если вы хотите распечатать ключи, как в 'entries', вам нужно проверить, находится ли ключ в' a' или 'c', используя' if entries [i] в ​​a'. Оформить заказ 'dict' и' list' типы в 'Python', если вам нужна помощь. –

0

Python словари неупорядоченный. Вы можете сортировать их перед печатью.

for key, value in sorted(c.items()): 
    print("{0}: {1}".format(key, value)) 

Я не уверен, почему вы получаете ключевую ошибку, но он может быть добавлен в Словаре a вместо c.

0

A Python dict - это несортированный контейнер, реализованный как hash table. Хеширующие строки «рандомизируют» свой порядок. И даже этот заказ не будет сохранен при фактической вставке их в хешированную структуру.

>>> sorted(string.ascii_uppercase, key=hash) 
['G', 'Z', 'M', 'V', 'L', 'K', 'C', 'J', 'P', 'N', 'D', 'O', 'Q', 'F', 'S', 'R', 'W', 'E', 'X', 'A', 'Y', 'B', 'I', 'U', 'H', 'T'] 
>>> set(_) 
{'F', 'M', 'B', 'W', 'G', 'D', 'A', 'C', 'X', 'R', 'K', 'E', 'N', 'V', 'U', 'Q', 'T', 'Z', 'S', 'I', 'L', 'P', 'J', 'H', 'Y', 'O'} 

Если вы хотите отсортировать ключи, то явно сортировать их:

for key in sorted(c.keys()): 
    print("{0}: {1}".format(key, c[entries[-1]]))