簡體   English   中英

排序字典鍵

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM