Как конвертировать dict в список dicts? - PullRequest
0 голосов
/ 04 декабря 2018
{'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 голосов
/ 05 декабря 2018

Вы можете использовать понимание списка после вычисления количества элементов списка:

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

Если вы можете использовать Pandas сторонних производителей, возможно, самый простой способ - это преобразовать в фрейм данных и затем использовать 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)}]
0 голосов
/ 05 декабря 2018

Другое решение

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
0 голосов
/ 05 декабря 2018

Предполагая, что все списки имеют одинаковую длину, вы можете сделать:

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

Идея состоит в том, чтобы создать словарь, в которомключ - это индексы, а значения - ожидаемые словари.

0 голосов
/ 05 декабря 2018

Я предполагаю, что это связано с тем, как хэшируются dict и list.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)
0 голосов
/ 05 декабря 2018

Если вы знаете длину списка, тогда это должно сработать:

[{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)}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...