[英]Python creating a dictionary from a csv file
我正在嘗試從csv文件創建數據字典,但遇到了一些麻煩。 我已經成功地從程序的兩個列表中制作了一個字典,下面是我的代碼:
playerRank = [[tournamentResults[i],rankingPoints[8]] for i in range(0,len(tournamentResults))]
dict1 = dict(playerRank)
但是,當我嘗試使用csv文件中的數據制作字典時,出現錯誤'TypeError:unhashable type:'list'。 下面是我嘗試的代碼:
totalRank = []
with open("mycsvfile.csv") as players:
for row in csv.reader(players):
totalRank.append(row)
totalRank = [[totalRank[i],0] for i in range(0,len(totalRank))]
dict2 = dict(totalRank)
我不明白為什么第二次制作字典的嘗試會拋出錯誤,而第一本字典沒問題? 我如何解決此問題的任何幫助將不勝感激!
問題是,如錯誤消息所示,列表不可散列,這意味着您不能將它們用作字典鍵。
實際上,列表不可哈希的原因是為了防止您將它們用作dict鍵。 列表是可變的,並且如果您在dict中更改鍵,則查找將不再起作用。 (從技術上講,您可以通過使用基於對象標識的哈希函數而不是所包含的值來解決此問題,但是==
不會有用,或者它不會與hash
。)
通常的解決方案非常簡單:除了不變之外,元組就像字典一樣。 因此,如果您的鍵是列表,請執行以下操作:
[[key, value] for ...]
… 你做這個:
[[tuple(key), value] for ...]
現在,您可以將其傳遞給dict
,一切正常。
當然,這假設您不想在創建序列后對其進行突變。
同時,我不確定您為什么首先要使用一系列值,實際上您可能想要更簡單的方法。 您的totalRank
是一個行列表,您可能只希望每一行中有一列 ,而不是整個內容。 在這種情況下,只需執行以下操作:
[[totalRank[0], 0] for ...]
或者,也可以執行totalRank.append(row[0])
而不是totalRank.append(row)
totalRank.append(row[0])
。
(我假設這是您想要的第一列;顯然,您可以執行row[3]
或任何其他操作。)
當我們使用它時,如果您使用的是Python 3或Python 2.7,則可以使用字典理解而不是列表理解來更可讀(也更有效)地編寫此代碼。 代替這個:
lst = [[key, value] for ...]
dct = dict(lst)
……只要這樣做:
dct = {key: value for ...}
另外,如果您唯一使用i
的是lst[i]
,則不必i in range(len(lst))
遍歷i in range(len(lst))
; 只是循環element in lst
。
放在一起:
dct2 = {tuple(rank): 0 for rank in totalRank}
…或根據您的需求:
dct2 = {rank[0]: 0 for rank in totalRank}
還有一項改進。 這個:
totalRank = []
for row in csv.reader(players):
totalRank.append(row)
只是一種冗長的寫法:
totalRank = list(csv.reader(players))
或者,如果只需要第一列:
totalRank = [row[0] for row in csv.reader(players))
因此,我們可以將整個循環簡化為:
with open("mycsvfile.csv") as players:
dict2 = {tuple(row): 0 for row in csv.reader(players)}
……或者再次:
with open("mycsvfile.csv") as players:
dict2 = {row[0]: 0 for row in csv.reader(players)}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.