[英]Sorting dictionary keys
我正在從具有以下語法的文件中讀取:
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
我需要創建一個字典,將名稱映射到他們的投票列表。 在這種情況下,名稱是Akaka和Alexander,而表決是從-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是另一個名稱,Bunning也是如此):
{'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的列表。 我的列表順序正確,但名稱不正確。 有沒有一種方法可以對字典中的名稱進行排序?
您重新組合列表不正確:
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()
將在寬度可變的空格上分割,並str.split()
刪除尾隨和前導空格。
然后,您可以將列表輸出分配給一系列名稱,包括其余所有項目的加星標名稱; 我用它來捕獲名稱,兩個被忽略的列,然后是votes
列表中的其余列,然后我們將它們轉換為具有列表理解的整數。
我認為您的三個循環使事情變得過於復雜(如果我沒看錯的話,應該嵌套)。 您可以簡單地做到這一點:
votingDict = {}
for line in voting_data:
parts = line.strip().split(' ')
name = parts[0]
votes = [int(v) for v in parts[3:]]
votingDict[name] = votes
基本上,當您閱讀行時,將提取名稱和投票,將投票轉換為整數並將其存儲在字典中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.