簡體   English   中英

創建一個包含子字典作為新值的字典,並使用索引作為鍵

[英]Creating a dict containing a sub-dict as the new value with the index as the key

我目前有一個字典設置為

{'name': 'firm', 'name':'firm', etc}, 

鍵是分析師名稱,值是分析師公司。

我正在嘗試創建一個新字典,其中新值是舊的k,v對,而關聯的鍵只是索引(1, 2, 3, 4, etc)

當前代碼如下:

num_analysts = len(analysts.keys())
for k,v in analysts.items():
    analysts_dict = dict.fromkeys(range(num_analysts), [k,v])

當前結果

每個數字鍵都被賦予相同的值(old k,v pair) 我的表情怎么了?

您可以枚舉項目並將其轉換為字典。 但是,通常不對字典進行排序。 這意味着可以基本上隨機地分配密鑰。

dict(enumerate(analysts.items(), 1))
#{1: ('name1', 'firm1'), 2: ('name2', 'firm2')}

對此進行枚舉和字典理解

d = {'name1': 'firm1', 'name2': 'firm2'}
d2 = {idx: '{}, {}'.format(item, d[item]) for idx, item in enumerate(d, start = 1)}
 {1: 'name1, firm1', 2: 'name2, firm2'} 

已經有其他人發布的有效答案。 因此,我可能只是提出您自己的解決方案無法正常工作的原因。 它可能是由於懶惰的綁定引起的。 上有很好的資源: http : //quickinsights.io/python/python-closures-and-late-binding/

因為后期綁定實際上會拾取您創建的詞典中的最后一個。 但是最后一個不是“實際上最后一個”,它由操作系統決定。 (其他人已經對dict數據結構做了一些解釋。)

每次在python命令行中運行時,結果可能都會改變。 如果將代碼放在.py文件中,則每次在IDE中運行時,結果都是相同的(總是dict中的最后一個)

在每次迭代期間, analysts_dict基於dict.items的結果分配的值()。 但是,您應該使用理解來在一行中生成最終結果,

例如: [{i: e} for i, e in enumerate(analysts.items())]

analysts = {
    "a": 13,
    "b": 123,
    "c": 1234
}
num_analysts = len(analysts.keys())
analysts_dict = [{i: e} for i, e in enumerate(analysts.items())]
print(analysts_dict)

>> [{0: ('a', 13)}, {1: ('b', 123)}, {2: ('c', 1234)}]

此代碼

for k,v in analysts.items(): 
    analysts_dict = dict.fromkeys(range(num_analysts), [k,v])

循環遍歷原始dict,並在每次循環迭代時使用范圍號作為鍵來創建新的dict。 順便說一句,該字典中的每個項目都共享對單個[k, v]列表對象的引用。 通常這是一個壞主意。 您只應使用不可變的對象(例如None ,數字或字符串)作為dict.fromkeys方法的arg值。 該方法的目的是允許您為提供的鍵創建具有簡單默認值的字典,如果您希望將這些列表作為單獨的列表,則不能使用它來將列表作為值來形成字典。

新的dict對象綁定到名稱analysts_dict 在下一個循環迭代中,將創建一個新的dict並將其綁定到該名稱,替換上一個循環中剛創建的dict,並銷毀替換的dict。

因此,您最終得到了analysts_dict其中包含一堆對從原始字典讀取的最后[k, v]對的引用。

為了獲得理想的結果,您應該使用DYZ的代碼,在此不再贅述。 請注意,它將舊名稱和公司信息存儲在元組中,這比為此應用程序使用列表要好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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