簡體   English   中英

如何轉換字典列表中的字典?

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

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