首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3:将多个字典合并到一个新字典中

Python3:将多个字典合并到一个新字典中
EN

Stack Overflow用户
提问于 2021-09-23 19:45:36
回答 3查看 59关注 0票数 1

如果这是复制的话我很抱歉。我肯定是这样,我想我只是不知道如何构建我想要问的问题,以便能够找到正确的答案。

我有一个函数,它每一行返回一本字典,如下所示:

代码语言:javascript
复制
{'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的行,如下所示:

代码语言:javascript
复制
{'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的新字典中。

代码语言:javascript
复制
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

我尝试了一种不同的变体,但它让我回到了我开始的地方:

代码语言:javascript
复制
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': {}}}

有什么指示吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-09-23 20:19:15

您可以使用dict的setdefaultupdate方法:

代码语言:javascript
复制
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']})
代码语言:javascript
复制
>>> 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

代码语言:javascript
复制
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']})

输出:

代码语言:javascript
复制
>>> 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}]
票数 2
EN

Stack Overflow用户

发布于 2021-09-23 20:18:46

假设你有一个如上面所示的字典列表..。

您可以使用collections.defaultdict来按symbol_name对dict进行分组,并创建预期的键,并使用它们对dict进行update

试试这个-

代码语言:javascript
复制
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)
代码语言:javascript
复制
[{'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}]
票数 1
EN

Stack Overflow用户

发布于 2021-09-23 20:28:21

以下是我的建议:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
{'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()获得结果

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69306132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档