[英]How to convert dict in list of dicts?
{'BTC': [(None, None), (1, -0.4), (3, 0.3333333333333333), (0, 0.75), (1, None)], 'ETH': [(None, None), (0, 0.5), (0, 0.3333333333333333), (0, -0.1), (2, None)]}
在這
[{'BTC': (None, None), 'ETH': (None, None)}, {'BTC': (1, -0.4), 'ETH': (0, 0.5)}, {'BTC': (3, 0.3333333333333333), 'ETH': (0, -0.1)}, {'BTC': (1, None), 'ETH': (2, None)}]
如果使用列表,則可以使用zip函數輕松進行轉換,但是如何使用字典來做到這一點?
假設您知道列表的長度,那么應該可以:
[{z:xx[z][i] for z in xx.keys()} for i in range(5)]
輸出量
[{'BTC': (None, None), 'ETH': (None, None)}, {'BTC': (1, -0.4), 'ETH': (0, 0.5)}, {'BTC': (3, 0.3333333333333333), 'ETH': (0, 0.3333333333333333)}, {'BTC': (0, 0.75), 'ETH': (0, -0.1)}, {'BTC': (1, None), 'ETH': (2, None)}]
先前的答案
[{z:xx[z][i]} for z in xx.keys() for i in range(5)]
輸出量
[{'BTC': (None, None)}, {'BTC': (1, -0.4)}, {'BTC': (3, 0.3333333333333333)}, {'BTC': (0, 0.75)}, {'BTC': (1, None)}, {'ETH': (None, None)}, {'ETH': (0, 0.5)}, {'ETH': (0, 0.3333333333333333)}, {'ETH': (0, -0.1)}, {'ETH': (2, None)}]
假設所有列表的長度相同,則可以執行以下操作:
d = {'BTC': [(None, None), (1, -0.4), (3, 0.3333333333333333), (0, 0.75), (1, None)],
'ETH': [(None, None), (0, 0.5), (0, 0.3333333333333333), (0, -0.1), (2, None)]}
table = {}
for key, values in d.items():
for i, value in enumerate(values):
table.setdefault(i, {})[key] = value
result = list(table.values())
print(result)
輸出量
[{'BTC': (None, None), 'ETH': (None, None)}, {'BTC': (1, -0.4), 'ETH': (0, 0.5)}, {'BTC': (3, 0.3333333333333333), 'ETH': (0, 0.3333333333333333)}, {'BTC': (0, 0.75), 'ETH': (0, -0.1)}, {'BTC': (1, None), 'ETH': (2, None)}]
這個想法是創建一個字典,其中的鍵是索引,值是期望的字典。
我的猜測是,它與字典和列表的散列方式有關。 Dict具有鍵值,並按其自身順序排列自己的顯示方式,而列表則不然。 您也可以在這里使用元組,這樣可能會影響它。 您以這種方式進行構造是否有原因? 似乎僅使用列表和字典可以更有效地完成它。
無論哪種方式,使用熊貓都會讓您的生活變得更好。 特別是當您將其用於加密貨幣或任何其他財務數據時。 它會為您做很多事。
假設股票行情是加密貨幣硬幣的列表。 然后我們使用代碼范圍(len(tickers))作為鍵來決定財務數據。
import pandas as pd
tickers=['BTC','ETC','ETH','LTC','XRP', etc.]
financial_data={}
for i in range(len(tickers)):
financial_data[i]= get_finince_data(tickers[i])
#^this isn't an actual function. just an example
#to represent whatever you're using to pull data
financial_data= pd.DataFrame(financial_data)
或者,如果您真的喜歡現在使用的結構。
d = {'BTC': [(None, None), (1, -0.4), (3, 0.3333333333333333), (0, 0.75), (1, None)],
'ETH': [(None, None), (0, 0.5), (0, 0.3333333333333333), (0, -0.1), (2, None)]}
d=pd.DataFrame(d)
另一種解決方案
result = []
for key, value in raw.items():
for index, item in enumerate(value):
if len(result) <= index:
result.append({key: item})
else:
result[index][key] = item
result
您可以在計算列表元素的數量之后使用列表推導:
d = {'BTC': [(None, None), (1, -0.4), (3, 0.3333333333333333), (0, 0.75), (1, None)],
'ETH': [(None, None), (0, 0.5), (0, 0.3333333333333333), (0, -0.1), (2, None)]}
n = len(next(iter(d_input.values())))
res = [{k: v[i] for k, v in d_input.items()} for i in range(n)]
如果您能夠使用第三方熊貓,也許最簡單的方法是轉換為數據to_dict
,然后使用to_dict
:
import pandas as pd
res = pd.DataFrame(d_input).to_dict('records')
print(res)
[{'BTC': (None, None), 'ETH': (None, None)},
{'BTC': (1, -0.4), 'ETH': (0, 0.5)},
{'BTC': (3, 0.3333333333333333), 'ETH': (0, 0.3333333333333333)},
{'BTC': (0, 0.75), 'ETH': (0, -0.1)},
{'BTC': (1, None), 'ETH': (2, None)}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.