2013-07-10 166 views
0

我從它具有以下語法的文件閱讀:排序字典鍵

Akaka D HI -1 -1 1 1 1 -1 -1 1 1 1 1 1 1 1 -1 1 1 1 -1 1 1 1 1 1 -1 1 -1 -1 1 1 1 1 1 1 0  0 1 -1 -1 1 -1 1 -1 1 1 -1 
Alexander R TN 1 1 1 1 1 1 1 1 1 -1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 

我需要創建的名稱映射到其投票列表的字典。在這種情況下,名稱是阿卡卡和亞歷山大和投票是一串數字,從-1,0和1例輸出將是:

{'Akaka': [-1 -1 1 1 1 -1 -1 1 1 1 1 1 1 1 -1 1 1 1 -1 1 1 1 1 1 -1 1 -1 -1 1 1 1 1 1 1 0 0 1 -1 -1 1 -1 1 -1 1 1 -1], 'Alexander': [1 1 1 1 1 1 1 1 1 -1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1]...,'name':[list of votes in integer form]} 

所以這是我使用的代碼:

for line in voting_data: 
    myList.append(line.strip().split(' ')) 
names = [] 
votes = [] 
intVotes = [] 
votingDict = {} 
for i in myList: 
    names.append(i[0]) 
for j in names: 
    votes.append(i[3:]) 
for k in votes: 
    intVotes.append([int(v) for v in k]) 

votingDict = {names[i]:votes[j] for i in range(len(names)) for j in range(len(votes))} 
print votingDict 

前幾輸出返回以下(Pyror是另一個名字,所以是邦寧):

{'Pryor': ['-1', '-1', '1', '1', '1', '-1', '-1', '1', '1', '1', '1', '1', '-1', '1', '1', '1', '1', '1', '-1', '1', '1', '1', '1', '1', '1', '1', '-1', '-1', '1', '1', '1', '1', '1', '1', '1', '-1', '1', '-1', '1', '1', '1', '1', '-1', '1', '1', '-1'], 'Bunning': ['-1', '-1', '1', '1', '1', '-1', '-1', '1', '1', '1', '1', '1', '-1', '1', '1', '1', '1', '1', '-1', '1', '1', '1', '1', '1', '1', '1', '-1', '-1', '1', '1', '1', '1', '1', '1', '1', '-1', '1', '-1', '1', '1', '1', '1', '-1', '1', '1', '-1'] 

我的問題是錯誤的名稱是越來越映射到錯誤列表。換句話說,映射到Pryor的列表實際上是映射到Alexander的列表。我的列表按正確的順序排列,但名稱不正確。有沒有辦法對這本詞典中的名字進行排序?

回答

2

您不正確重組的名單:

votingDict = {names[i]:votes[j] for i in range(len(names)) for j in range(len(votes))} 

這將創建一個嵌套循環,而不是並行循環。這裏正常的解決方案是使用zip()

votingDict = {name: vote for name, vote in zip(names, votes)} 

但是,您可以通過構建votingDict映射大大簡化你的代碼,同時遍歷文件:

votingDict = {} 
for line in voting_data: 
    name, ign1, ign2, *votes = line.split() 
    votingDict[name] = [int(v) for v in votes] 

str.split()沒有參數將各執變量寬度爲的空白,並刪除尾隨和領先的空白,一氣呵成。

然後,您可以將列表輸出分配給一系列名稱,其中包括其餘項目的全部加星標名稱;我用它來捕獲名稱,兩個被忽略的列,然後在votes列表中的其餘部分,然後我們將其轉換爲具有列表理解的整數。

+0

謝謝,你是對的我正在笨拙 - –

1

我認爲你用三個循環過度複雜(如果我正確讀取,應該嵌套)。你可以簡單地這樣做:

votingDict = {} 
for line in voting_data: 
    parts = line.strip().split(' ') 
    name = parts[0] 
    votes = [int(v) for v in parts[3:]] 
    votingDict[name] = votes 

基本上,當你讀你的線條,您提取的名稱和選票,轉換票整數,並將它們存儲在你的字典。