如果这是复制的话我很抱歉。我肯定是这样,我想我只是不知道如何构建我想要问的问题,以便能够找到正确的答案。
我有一个函数,它每一行返回一本字典,如下所示:
{'symbol_name': 'AUDIOUSDT', 'timeframe_name': '1m', 'scenario': 1, 'continuity': 1}
{'symbol_name': 'AUDIOUSDT', 'timeframe_name': '3m', 'scenario': 2, 'continuity': 1}
{'symbol_name': 'AUDIOUSDT', 'timeframe_name': '5m', 'scenario': 1, 'continuity': 1}
{'symbol_name': 'AUDIOUSDT', 'timeframe_name': '15m', 'scenario': 1, 'continuity': 1}
{'symbol_name': 'AUDIOUSDT', 'timeframe_name': '30m', 'scenario': 2, 'continuity': 1}
{'symbol_name': 'AUDIOUSDT', 'timeframe_name': '1h', 'scenario': 2, 'continuity': 1}
...
{'symbol_name': 'TRBUSDT', 'timeframe_name': '1m', 'scenario': -2, 'continuity': 0}
{'symbol_name': 'TRBUSDT', 'timeframe_name': '3m', 'scenario': 2, 'continuity': 1}
{'symbol_name': 'TRBUSDT', 'timeframe_name': '5m', 'scenario': 1, 'continuity': -1}
{'symbol_name': 'TRBUSDT', 'timeframe_name': '15m', 'scenario': 1, 'continuity': -1}
{'symbol_name': 'TRBUSDT', 'timeframe_name': '30m', 'scenario': 2, 'continuity': 1}
{'symbol_name': 'TRBUSDT', 'timeframe_name': '1h', 'scenario': 2, 'continuity': 1}我希望创建一个新的字典行,将数据合并为具有公共symbol_name的行,如下所示:
{'symbol_name': 'AUDIOUSDT', '1m_scenario': 1, '1m_continuity': 1, '3m_scenario': 2, '3m_continuity': 1, '5m_scenario': 1, '5m_continuity': 1, '15m_scenario': 1, '15m_continuity': 1, '30m_scenario': 2, '3m_continuity': 1, '1h_scenario': 2, '1h_continuity': 1 }
...
{'symbol_name': 'TRBUSDT', '1m_scenario': -2, '1m_continuity': 0, '3m_scenario': 2, '3m_continuity': 1, '5m_scenario': 1, '5m_continuity': -1, '15m_scenario': 1, '15m_continuity': -1, '30m_scenario': 2, '3m_continuity': 1, '1h_scenario': 2, '1h_continuity': 1 }我很难弄清楚该怎么做。我试着把它分解成小块,这样我就可以掌握它的窍门了,首先是把每个timeframe放到一个基于symbols_name的新字典中。
data = {}
for item in query:
symbol = item['symbol_name']
timeframe = item['timeframe_name']
data[symbol] = {}
data[symbol][timeframe] = {}
print(data)
# returns:
{'AUDIOUSDT': {'1h': {}}, ... 'TRBUSDT': {'1h': {}}}在上面的例子中,我想我会在我正在尝试的新字典行中看到其他的timeframe键,而不仅仅是1h,因为每次循环运行时,timeframe_name是不同的,但我只看到了最后一个timeframe_name。
我尝试了一种不同的变体,但它让我回到了我开始的地方:
for item in query:
symbol = item['symbol_name']
timeframe = item['timeframe_name']
data = {}
data[symbol] = {}
data[symbol][timeframe] = {}
print(data)
# returns:
{'AUDIOUSDT': {'1m': {}}}
{'AUDIOUSDT': {'3m': {}}}
{'AUDIOUSDT': {'5m': {}}}
{'AUDIOUSDT': {'15m': {}}}
{'AUDIOUSDT': {'30m': {}}}
{'AUDIOUSDT': {'1h': {}}}
...
{'TRBUSDT': {'1m': {}}}
{'TRBUSDT': {'3m': {}}}
{'TRBUSDT': {'5m': {}}}
{'TRBUSDT': {'15m': {}}}
{'TRBUSDT': {'30m': {}}}
{'TRBUSDT': {'1h': {}}}有什么指示吗?
发布于 2021-09-23 20:19:15
您可以使用dict的setdefault和update方法:
data = {}
for item in query:
symbol = item['symbol_name']
timeframe = item['timeframe_name']
d = data.setdefault(symbol, {})
d.update({'symbol_name': symbol,
f'{timeframe}_scenario': item['scenario'],
f'{timeframe}_continuity': item['continuity']})>>> list(data.values())
[{'symbol_name': 'AUDIOUSDT',
'1m_scenario': 1,
'1m_continuity': 1,
'3m_scenario': 2,
'3m_continuity': 1,
'5m_scenario': 1,
'5m_continuity': 1,
'15m_scenario': 1,
'15m_continuity': 1,
'30m_scenario': 2,
'30m_continuity': 1,
'1h_scenario': 2,
'1h_continuity': 1},
{'symbol_name': 'TRBUSDT',
'1m_scenario': -2,
'1m_continuity': 0,
'3m_scenario': 2,
'3m_continuity': 1,
'5m_scenario': 1,
'5m_continuity': -1,
'15m_scenario': 1,
'15m_continuity': -1,
'30m_scenario': 2,
'30m_continuity': 1,
'1h_scenario': 2,
'1h_continuity': 1}]旧答案(以避免与@AkshaySehgal重复的答案)
使用来自defaultdict模块的collections
from collections import defaultdict
data = collections.defaultdict(dict)
for item in query:
symbol = item['symbol_name']
timeframe = item['timeframe_name']
data[symbol].update({'symbol_name': symbol,
f'{timeframe}_scenario': item['scenario'],
f'{timeframe}_continuity': item['continuity']})输出:
>>> list(data.values())
[{'symbol_name': 'AUDIOUSDT',
'1m_scenario': 1,
'1m_continuity': 1,
'3m_scenario': 2,
'3m_continuity': 1,
'5m_scenario': 1,
'5m_continuity': 1,
'15m_scenario': 1,
'15m_continuity': 1,
'30m_scenario': 2,
'30m_continuity': 1,
'1h_scenario': 2,
'1h_continuity': 1},
{'symbol_name': 'TRBUSDT',
'1m_scenario': -2,
'1m_continuity': 0,
'3m_scenario': 2,
'3m_continuity': 1,
'5m_scenario': 1,
'5m_continuity': -1,
'15m_scenario': 1,
'15m_continuity': -1,
'30m_scenario': 2,
'30m_continuity': 1,
'1h_scenario': 2,
'1h_continuity': 1}]发布于 2021-09-23 20:18:46
假设你有一个如上面所示的字典列表..。
您可以使用collections.defaultdict来按symbol_name对dict进行分组,并创建预期的键,并使用它们对dict进行update。
试试这个-
from collections import defaultdict
l= [{'symbol_name': 'AUDIOUSDT', 'timeframe_name': '1m', 'scenario': 1, 'continuity': 1},
{'symbol_name': 'AUDIOUSDT', 'timeframe_name': '3m', 'scenario': 2, 'continuity': 1},
{'symbol_name': 'AUDIOUSDT', 'timeframe_name': '5m', 'scenario': 1, 'continuity': 1},
{'symbol_name': 'AUDIOUSDT', 'timeframe_name': '15m', 'scenario': 1, 'continuity': 1},
{'symbol_name': 'AUDIOUSDT', 'timeframe_name': '30m', 'scenario': 2, 'continuity': 1},
{'symbol_name': 'AUDIOUSDT', 'timeframe_name': '1h', 'scenario': 2, 'continuity': 1},
{'symbol_name': 'TRBUSDT', 'timeframe_name': '1m', 'scenario': -2, 'continuity': 0},
{'symbol_name': 'TRBUSDT', 'timeframe_name': '3m', 'scenario': 2, 'continuity': 1},
{'symbol_name': 'TRBUSDT', 'timeframe_name': '5m', 'scenario': 1, 'continuity': -1},
{'symbol_name': 'TRBUSDT', 'timeframe_name': '15m', 'scenario': 1, 'continuity': -1},
{'symbol_name': 'TRBUSDT', 'timeframe_name': '30m', 'scenario': 2, 'continuity': 1},
{'symbol_name': 'TRBUSDT', 'timeframe_name': '1h', 'scenario': 2, 'continuity': 1}]
d = defaultdict(dict)
for i in l:
k = {'symbol_name':i['symbol_name'],
i['timeframe_name']+'_scenario':i['scenario'],
i['timeframe_name']+'_continuity':i['continuity']}
d[i['symbol_name']].update(k)
output = list(d.values())
print(output)[{'symbol_name': 'AUDIOUSDT', '1m_scenario': 1, '1m_continuity': 1, '3m_scenario': 2, '3m_continuity': 1, '5m_scenario': 1, '5m_continuity': 1, '15m_scenario': 1, '15m_continuity': 1, '30m_scenario': 2, '30m_continuity': 1, '1h_scenario': 2, '1h_continuity': 1},
{'symbol_name': 'TRBUSDT', '1m_scenario': -2, '1m_continuity': 0, '3m_scenario': 2, '3m_continuity': 1, '5m_scenario': 1, '5m_continuity': -1, '15m_scenario': 1, '15m_continuity': -1, '30m_scenario': 2, '30m_continuity': 1, '1h_scenario': 2, '1h_continuity': 1}]发布于 2021-09-23 20:28:21
以下是我的建议:
query = [{'symbol_name': 'AUDIOUSDT', 'timeframe_name': '1m', 'scenario': 1, 'continuity': 1},
{'symbol_name': 'AUDIOUSDT', 'timeframe_name': '3m', 'scenario': 2, 'continuity': 1},
{'symbol_name': 'AUDIOUSDT', 'timeframe_name': '5m', 'scenario': 1, 'continuity': 1},
{'symbol_name': 'AUDIOUSDT', 'timeframe_name': '15m', 'scenario': 1, 'continuity': 1},
{'symbol_name': 'AUDIOUSDT', 'timeframe_name': '30m', 'scenario': 2, 'continuity': 1},
{'symbol_name': 'AUDIOUSDT', 'timeframe_name': '1h', 'scenario': 2, 'continuity': 1},
{'symbol_name': 'TRBUSDT', 'timeframe_name': '1m', 'scenario': -2, 'continuity': 0},
{'symbol_name': 'TRBUSDT', 'timeframe_name': '3m', 'scenario': 2, 'continuity': 1},
{'symbol_name': 'TRBUSDT', 'timeframe_name': '5m', 'scenario': 1, 'continuity': -1},
{'symbol_name': 'TRBUSDT', 'timeframe_name': '15m', 'scenario': 1, 'continuity': -1},
{'symbol_name': 'TRBUSDT', 'timeframe_name': '30m', 'scenario': 2, 'continuity': 1},
{'symbol_name': 'TRBUSDT', 'timeframe_name': '1h', 'scenario': 2, 'continuity': 1}]
res = {}
for i in query:
res[i['symbol_name']] = {'symbol_name':i['symbol_name']}
for i in query:
x = i['timeframe_name']
scen_key = x + '_' + 'scenario'
con_key = x + '_' + 'continuity'
if scen_key in res[i['symbol_name']]:
res[i['symbol_name']][scen_key] += i['scenario']
else:
res[i['symbol_name']][scen_key] = i['scenario']
if con_key in res[i['symbol_name']]:
res[i['symbol_name']][con_key] += i['continuity']
else:
res[i['symbol_name']][con_key] = i['continuity']
print(res)输出:
{'AUDIOUSDT': {'symbol_name': 'AUDIOUSDT', '1m_scenario': 1, '1m_continuity': 1, '3m_scenario': 2, '3m_continuity': 1, '5m_scenario': 1, '5m_continuity': 1, '15m_scenario': 1, '15m_continuity': 1, '30m_scenario': 2, '30m_continuity': 1, '1h_scenario': 2, '1h_continuity': 1}, 'TRBUSDT': {'symbol_name': 'TRBUSDT', '1m_scenario': -2, '1m_continuity': 0, '3m_scenario': 2, '3m_continuity': 1, '5m_scenario': 1, '5m_continuity': -1, '15m_scenario': 1, '15m_continuity': -1, '30m_scenario': 2, '30m_continuity': 1, '1h_scenario': 2, '1h_continuity': 1}}如果您希望将结果作为列表,则可以使用res.values()获得结果
https://stackoverflow.com/questions/69306132
复制相似问题