2015-05-30 3 views
1

У меня есть следующий код, это адресная книга (список словарей) и список. Идея состоит в том, чтобы напечатать элементы из словаря в порядке списка (поскольку dicts испортил порядок всего). Когда я запускаю этот код, он генерирует исключение (как показано ниже). Я не уверен, что я делаю неправильно, поскольку я пробовал много разных вариантов, и я продолжаю возвращаться к этому, задаваясь вопросом, почему он не работает.Печать дикторана со списком

Помогите?

addressBook = [ 
    { 
    'Nickname': 'Jimmy', 
    'Name': 'James Roberts', 
    'Address': '2/50 Robe Street', 
    'Phone': '0273503342' 
    }, 
    { 
    'Nickname': 'Bob', 
    'Name': 'Robert', 
    'Address': '1 Vivan Street', 
    'Phone': '067578930' 
    } 
] 

addressFields = ['Nickname', 'Name', 'Address', 'Phone'] 

def listAll(addressBook, addressFields): 
    for i in addressBook: 
     for key in addressFields: 
      print("{0} {1}".format(key, addressBook[i][key])) 

    print("{0} {1}".format(key, addressBook[i][key])) 


TypeError: list indices must be integers, not dict 

ответ

2

Во-первых, вам не хватает в addressBook буквальным в ' после 'James Roberts. Во-вторых, проблема заключалась в том, что вы делали addressBook[i][key] вместо i[key]. i уже относится к словарю, содержащемуся в addressBook, поэтому ваш код пытался использовать элемент list в качестве индекса для себя.

def listAll(addressBook, addressFields): 
    for i in addressBook: 
     for key in addressFields: 
      print('{} {}'.format(key, i[key])) 

Python 3 дружественный один вкладыш:

def listAll(addressBook, addressFields): 
    print(*('{} {}'.format(j, i[j]) for i in addressBook for j in addressFields), sep='\n') 
-1

После публикации этого вопроса я нашел ответ.

Я преобразовал адресную книгу для цикла в диапазон (len (addressBook)), и он сработал.

for i in range(len(addressBook)): 
+1

В Python 'для г в диапазоне (LEN (х)) 'редко - правильный путь. Проблема заключалась не в том, как вы настраивали цикл, а в том, что вы делали внутри него. – TigerhawkT3

0
#!/usr/bin/python 

addressBook = [{'Nickname': 'Jimmy', 'Name': 'James Roberts', 'Address': '2/50 Robe Street', 'Phone': '0273503342'},{'Nickname': 'Bob', 'Name': 'Robert', 'Address': '1 Vivan Street', 'Phone': '067578930'}] 

addressFields = ['Nickname', 'Name', 'Address', 'Phone'] 

def listAll(addressBook, addressFields): 
    for i in addressBook: 
    for val in addressFields: 
     print("{0} {1}".format(val, i[val])) 

listAll(addressBook, addressFields) 
1

В качестве альтернативы в одной строке:

print('\n'.join(element for element in [j+" "+ i[j] for i in addressBook for j in addressFields] 
)) 
+0

Вы можете очистить это следующим образом: 'print (* (j +" "+ i [j] для i в адресной книге для j в addressFields), sep = '\ n')'. Элемент 'element for element in' необходим только в том случае, если вы добавляете условие фильтрации (которого вы не в этом случае). – TigerhawkT3

+0

Я убедился, что он работает как в python2, так и в 3 – Ajay

+0

FWIW, лучше использовать '.join' в списке comp, чем в gen exp: если вы кормите его gen exp, он должен преобразовать его в список. Причина «.join» заключается в том, что он должен дважды проверять данные: один раз для определения общей требуемой длины строки и затем для фактической сборки строки. Если он не выполнил двойное сканирование, ему пришлось бы построить выходную строку, используя повторную конкатенацию строк, что очень расточительно. –

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