python - 嵌套defaultdict(list)分组

标签 python

我有一个结果行 block ,我试图将它们分组为两层嵌套[{key: value[{key:value[]}]}]。这些值在顶级键上不是唯一的。

我一直在尝试使用defaultdict,但由于非唯一性,在两个级别上都没有成功分组。迭代数据可能会更好,但我也没有成功。

起始数据:

data = 
[{'Name': 'Bob', 'Time': 12, 'Place': 'Home'}, 
{'Name': 'Bob', 'Time': 11, 'Place': 'Home'}, 
{'Name': 'Jerry', 'Time': 5, 'Place': 'Home'}, 
{'Name': 'Jerry', 'Time': 11, 'Place': '-----'}, 
{'Name': 'Jerry', 'Time': 11, 'Place': 'Work'}]

最终所需数据:

[{"Name": "Bob", "Details":[{"Place":"Home", "Time":[12, 11]}]}, 
{"Name": "Jerry", "Details":[{"Place":"Home", "Time":[5]}, 
                             {"Place":"-----", "Time":[11]}, 
                             {"Place":"Work", "Time":[11]}]}]  

最佳答案

您可以使用itertools.groupby名称地点进行分组,

>>> import itertools
>>> from collections import defaultdict
>>> data
[{'Name': 'Bob', 'Time': 12, 'Place': 'Home'}, {'Name': 'Bob', 'Time': 11, 'Place': 'Home'}, {'Name': 'Jerry', 'Time': 5, 'Place': 'Home'}, {'Name': 'Jerry', 'Time': 11, 'Place': '-----'}, {'Name': 'Jerry', 'Time': 11, 'Place': 'Work'}]
>>> sorted_data = sorted(data, key=lambda x: (x['Name'], x['Place'])) # sorting before grouping as suggested by @wwii, because The returned group is itself an iterator that shares the underlying iterable with groupby(). Please see (https://docs.python.org/3/library/itertools.html#itertools.groupby)
>>> d = defaultdict(list)
>>> y = itertools.groupby(sorted_data, lambda x: (x['Name'], x['Place']))
>>> for group, grouper in y:
...   time_ = [item['Time'] for item in grouper]
...   name, place = group
...   d[name].append({'Place': place, 'Time': time_})
... 
>>> d
defaultdict(<class 'list'>, {'Bob': [{'Place': 'Home', 'Time': [12, 11]}], 'Jerry': [{'Place': 'Home', 'Time': [5]}, {'Place': '-----', 'Time': [11]}, {'Place': 'Work', 'Time': [11]}]})
>>> pprint.pprint(dict(d))
{'Bob': [{'Place': 'Home', 'Time': [12, 11]}],
 'Jerry': [{'Place': 'Home', 'Time': [5]},
           {'Place': '-----', 'Time': [11]},
           {'Place': 'Work', 'Time': [11]}]}

如果您需要当时显示的确切结构,

>>> f_data = []
>>> for key, value in d.items():
...   f_data.append({'Name': key, 'Details': value})
... 
>>> pprint.pprint(f_data)
[{'Details': [{'Place': 'Home', 'Time': [12, 11]}], 'Name': 'Bob'},
 {'Details': [{'Place': '-----', 'Time': [11]},
              {'Place': 'Home', 'Time': [5]},
              {'Place': 'Work', 'Time': [11]}],
  'Name': 'Jerry'}]

关于python - 嵌套defaultdict(list)分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55762857/

相关文章:

python - pyperclip 模块引发错误消息

python - 用句子增量训练 Sklearn 的 SGD 分类器

python - 类方法包装函数-参数问题

javascript - 无法使用 python selenium 获取生成的 html 源

python - 如何创建显示均值、中位数和众数的seaborn fiddle 图?

python - 重置 csv.reader() 迭代器

python - python中的正则表达式,一个特例

python - 在 Django 中更改使用 ModelForm 创建的表单元素的宽度

python - 在python中将行号添加到字符串中

python - 计算文章摘要