python - 将多个元组转换为嵌套字典
问题描述
我有这组元组:
tokens = [('abstract', '1'), ('text', '1'), ('oie', '1'), ('idk', '1'), ('idk', '2'), ('pos', '2'), ('idk', '2'), ('idk', '2'), ('com', '2'), ('ggg', '4'), ('obama', '4'), ('joe', '4'), ('idk', '4')]
我需要将它放入这样的嵌套字典中:
dict_items([('abstract', {'1': 1}), ('text', {'1': 1}), ('oie', {'1': 1}), ('idk', {'1': 1, '2': 3, '4': 1}), ('pos', {'2': 1}), ('com', {'2': 1}), ('ggg', {'4': 1}), ('obama', {'4': 1}), ('joe', {'4': 1})])
这是:"term1" : {"text file number":"number of appearences"}
因此,“idk”一词在文档 1 中出现了 1 次,在文档 2 中出现了 3 次,在文档 4 中出现了 2 次
解决方案
采用:
tokens = [('abstract', '1'), ('text', '1'), ('oie', '1'), ('idk', '1'), ('idk', '2'), ('pos', '2'),
('idk', '2'), ('idk', '2'), ('com', '2'), ('ggg', '4'), ('obama', '4'), ('joe', '4'), ('idk', '4')]
res = {}
for o, i in tokens:
if o not in res:
res[o] = {}
if i not in res[o]:
res[o][i] = 0
res[o][i] += 1
print(res)
输出
{'abstract': {'1': 1}, 'text': {'1': 1}, 'oie': {'1': 1}, 'idk': {'1': 1, '2': 3, '4': 1}, 'pos': {'2': 1}, 'com': {'2': 1}, 'ggg': {'4': 1}, 'obama': {'4': 1}, 'joe': {'4': 1}}
一种替代方法是使用collections.defaultdict
from collections import defaultdict
tokens = [('abstract', '1'), ('text', '1'), ('oie', '1'), ('idk', '1'), ('idk', '2'), ('pos', '2'), ('idk', '2'), ('idk', '2'), ('com', '2'), ('ggg', '4'), ('obama', '4'), ('joe', '4'), ('idk', '4')]
d = defaultdict(lambda : defaultdict(int))
for o, i in tokens:
d[o][i] += 1
res = { k : dict(v) for k, v in d.items()}
print(res)
输出
{'abstract': {'1': 1}, 'text': {'1': 1}, 'oie': {'1': 1}, 'idk': {'1': 1, '2': 3, '4': 1}, 'pos': {'2': 1}, 'com': {'2': 1}, 'ggg': {'4': 1}, 'obama': {'4': 1}, 'joe': {'4': 1}}
第三种选择是使用collections.Counter
:
from collections import Counter
tokens = [('abstract', '1'), ('text', '1'), ('oie', '1'), ('idk', '1'), ('idk', '2'), ('pos', '2'),
('idk', '2'), ('idk', '2'), ('com', '2'), ('ggg', '4'), ('obama', '4'), ('joe', '4'), ('idk', '4')]
d = {}
for (o, i), value in Counter(tokens).items():
if o not in d:
d[o] = {}
d[o].update({i : value})
print(d)
推荐阅读
- python - 从 SQLAlchemy、Flask 返回 JSON 对象,用于 3 个相关表
- python - 获取包含调用函数的脚本路径
- css - 如何在 Reactstrap 中更改背景颜色
- r - 从定义的列中减去每 4 列
- ios - Firebase iOS -Key/Value 对没有从数据库中物理删除
- jquery - jquery选择器无法找到可见的最后一个孩子
- java - Spring单例范围的bean对于不同的对象具有不同的propeties值
- reactjs - React 和 Firebase:通过 UID 获取用户信息
- ruby - 厨师:为什么我没有读取我刚刚设置的属性值?
- ruby-on-rails - rails查询接口加入参数错误