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