python - 将多个元组转换为嵌套字典

标签 python list dictionary

我有这组元组:

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”:{“文本文件编号”:“出现次数”}

因此术语“idk”在文档 1 中出现一次,在文档 2 中出现 3 次,在文档 4 中出现两次

最佳答案

用途:

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 - 将多个元组转换为嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69757884/

相关文章:

python - 尝试将重量分类为 python 中的包

python - 列表理解中的动态自引用条件

java - JAXB 编码/解码具有 List 变量成员的类对象

dictionary - 如何在Python 3中实现UserDict.DictMixin的功能?

python - 将区域分配给字典中的状态时如何修复 KeyError

python - 如何使用 pandas 交叉表汇总年度犯罪计数?

python - "the choice must be consistent for all consumers"是什么意思?

动态散列字典的 Pythonic 方法?

python - '\' '.\' 和 '\.' 在 SQL Alchemy 上下文中意味着什么?

python - 列表推导式到 For 循环