2015-05-30 62 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

首先,你'James Roberts後失蹤的addressBook字面'。其次,問題在於您正在執行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

在發佈這個問題後,我找到了答案。

我將addressBook for loop轉換爲一個範圍(len(addressBook)),它工作。

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

在Python,'爲i的範圍(LEN(x)的)'很少是正確的路要走。問題不在於你如何設置循環,而在於你在做什麼。 – 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] for addressBook for j in addressFields),sep ='\ n')'。只有當你添加一個過濾條件(你不在這種情況下)時才需要元素的元素。 – TigerhawkT3

+0

我確定它可以在python2和3 – Ajay

+0

FWIW中使用,最好在list comp上使用'.join'而不是在gen exp上:如果你給它一個gen exp,它必須將它轉換爲一個列表。 '.join'的原因是它必須掃描數據兩次:一次確定所需的總字符串長度,然後再次實際構建字符串。如果它沒有執行雙重掃描,則必須使用重複的字符串連接來構建輸出字符串,這非常浪費。 –