如何转换字典列表中的字典?

时间:2018-12-04 20:59:52

标签: python dictionary

{'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函数轻松进行转换,但是如何使用字典来做到这一点?

5 个答案:

答案 0 :(得分:0)

假设您知道列表的长度,则应该可以:

[{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)}]

答案 1 :(得分:0)

假设所有列表的长度相同,则可以执行以下操作:

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)}]

这个想法是创建一个字典,其中的键是索引,值是期望的字典。

答案 2 :(得分:0)

我的猜测是,它与如何对字典和列表进行哈希处理有关。 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)

答案 3 :(得分:0)

另一种解决方案

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

答案 4 :(得分:0)

您可以在计算列表元素的数量之后使用列表理解:

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

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)}]