【问题标题】:Build new dictionary from list of dictionary based on same key从基于相同键的字典列表中构建新字典
【发布时间】:2017-11-29 19:51:59
【问题描述】:

我正在尝试根据 categoryName 键的相同值对字典进行分组。

列表字典的来源

data = [{'category_id': 1,
  'categoryName': 'Civil',
  'author': 'x',
  'title': 'Stone'},
 {'category_id': 1,
  'categoryName': 'Civil',
  'author': 'y',
  'title': 'House'},
 {'category_id': 2,
  'categoryName': 'Programming',
  'author': 'x',
  'title': 'Python'},
 {'category_id': 2,
  'categoryName': 'Programming',
  'author': 'y',
  'title': 'Java'}]

我的目标输出

new_data = {'Civil':[{'Title':'Stone', 'author':'x'},
                   {'Title':'House', 'author':'y'}],
         'Programming':[{'Title':'Python', 'author':'x'},
                       {'Title':'Java', 'author':'y'}]}

到目前为止我的尝试:

建立类别名称列表

categories = set([i['categoryName'] for i in data])

然后用

构建新的字典
d = {}
for cat in categories:
    d[cat] = []
    for book in data:
        if book['category_name'] == cat:
            d[cat].append(book)

它有效。但我认为这不是正确或优雅的方式。

寻找更多解决方案。谢谢!

【问题讨论】:

  • 在提问之前你自己尝试过做什么?
  • 正如@depperm 所说,首先向我们展示您的代码,但也请查看defaultdict,它会在这里真正为您提供帮助。
  • @depperm 嗨,抱歉,忘记添加我自己的尝试。我已经编辑了这个问题。谢谢!

标签: python dictionary


【解决方案1】:

由于您需要从data 的每个元素中获取详细信息,我将跳过set 步骤并遍历每个列表元素以获取标题和作者。如果类别在 new_data 中,则附加到列表中,否则添加包含所需信息的新列表。

data = [{'category_id': 1,
  'categoryName': 'Civil',
  'author': 'x',
  'title': 'Stone'},
 {'category_id': 1,
  'categoryName': 'Civil',
  'author': 'y',
  'title': 'House'},
 {'category_id': 2,
  'categoryName': 'Programming',
  'author': 'x',
  'title': 'Python'},
 {'category_id': 2,
  'categoryName': 'Programming',
  'author': 'y',
  'title': 'Java'}]

new_data={}
for d in data:
  if d['categoryName'] in new_data:
    new_data[d['categoryName']].append({'Title':d['title'],'author':d['author']}) 
  else:
    new_data[d['categoryName']]=[{'Title':d['title'],'author':d['author']}]

print(new_data)
#{'Civil': [{'Title': 'Stone', 'author': 'x'}, {'Title': 'House', 'author': 'y'}], 'Programming': [{'Title': 'Python', 'author': 'x'}, {'Title': 'Java', 'author': 'y'}]}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 2020-04-06
    相关资源
    最近更新 更多