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