【问题标题】:Combining multiple dictionaries in Python在 Python 中组合多个字典
【发布时间】:2016-02-25 05:28:29
【问题描述】:

我有一个 12 GB 的文件,其中每一行都是一个 JSON 对象,格式如下:

{
    "name": "abc", 
    "val1":500,
    "val2":30, 
    "val3":{
               "topic1":{
                            "val4":["abc","xyz"],
                            "val5":["asdf"]
                        }
           }
}

不幸的是,这是对象结构,无法更改。

假设我在这个文件中有另一行:

{
    "name": "abc", 
    "val1":300,
    "val2":10, 
    "val3":{
               "topic2":{
                            "val4":["hello","world"],
                            "val5":["test"]
                        }
           }
}

我现在需要合并具有相同名称的对象,以便获得以下形式的对象:

{
    "name": "abc", 
    "val1":800,
    "val2":40, 
    "val3":{
               "topic1":{
                            "val4":["abc","xyz"],
                            "val5":["asdf"]
                        },
               "topic2":{
                            "val4":["hello","world"],
                            "val5":["test"]
                        }
           }
}

我正在逐行读取文件并在 Python 中加载每一行的 JSON 对象。所以每一行基本上都变成了 Python dict()。然后我将此对象存储在 MongoDB 集合中,如果文件中出现另一个具有相同名称的对象,我将更新 Mongo 记录,以便将其合并,如上例所示。

我正在尝试采用与 Integrating multiple dictionaries in python (big data) 相同的方法,但我使用 Mongodb 来适应某些值的对象结构。但是,即使对于 400 MB 的示例文件,这也很慢。

有什么方法可以更好地做到这一点,也许使用某种并行处理?

【问题讨论】:

  • 不太清楚你在问什么。数据是否已经导入到 MongoDB 集合中?在任何一种情况下,您是否还意味着 { "name": "abc", "val3": { "topic1": { "val4": ["efg","abc"] } } }` 将与上述结合一个“val4”数组是["abc","xyz",efg"]?还是什么?
  • 无论如何,mapReduce 可能不是一个“好”的选择,考虑到所有输出“必须”本质上是 {"_id": "something", "value": "somethingElse" },因为 _idvalue 都是强制性的作为结构,无论它们包含什么。因此,如果您的目标是新系列,则不是最佳选择。但如果你能忍受,那就没问题了。
  • 不,数据存在于文件中。我正在尝试使用 MongoDB 组合这些行。组合将是 { "name": "abc", "val3": { "topic1":{ "val4":["abc","xyz"], "val5":["asdf"]} , "topic2 ":{"val4": ["efg", "abc"]}}} 。具有相同“名称”字段的两个对象在“val3”中不会都具有“topic1”(或任何相同的键)。
  • 为了澄清,我试图将具有相同“名称”字段的多个此类对象组合成一个对象。为此,我需要在它们是数字的地方添加值,并在它是嵌套对象的地方组合值
  • 对不起,但真的很清楚,你也应该清楚是否最终将信息存储在 MongoDB 中是你的“意图”。如果不是,而您只是在考虑使用“工具”,那么这有点像用电锯切三明治。通过将对象包含在您的“问题”正文中并在其中添加 edit 而不是在 cmets 中,您关于对象如何“合并”的示例将更加清晰。

标签: python json mongodb dictionary


【解决方案1】:

这段代码应该会有所帮助。

# not tested
import json

mydict = {}
with open(myfile,'r') as infile:
    for line in infile:
        myline = json.loads(line)
        if myline['name'] in mydict:
            mydict[myline['name']]['val1'] += myline['val1']
            mydict[myline['name']]['val2'] += myline['val2']
            mydict[myline['name']]['val3'] += [myline['val3']]
        else:
            mydict[myline['name']] = myline
            mydict[myline['name']]['val3'] = [myline['val3']]

但是,您的问题确实模棱两可,所以这是我对您要完成的工作的看法。

编辑:我只是连接字典,但您可以在 .append(myline) 发生的部分实现更复杂的合并逻辑。

【讨论】:

  • 感谢您的回答。不幸的是,我没有很好地表达我的问题,这不是我想要的。我已经编辑了我的问题,使其更易于理解,希望您能提供帮助!
  • 我进行了一些编辑以使其更接近您的需要。我的意思不是给你一段可以粘贴到应用程序中的代码。更重要的是给你一个你可以建造的脚手架。希望对您有所帮助。
  • 我最初尝试了这种方法,但文件为 12 GB,并且字典(mydict,在您的示例代码中)内存不足。我正在尝试使用此文件,但现在处理文件的较小子集
猜你喜欢
  • 2020-07-29
  • 1970-01-01
  • 2018-12-07
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 2018-01-11
  • 2012-05-20
  • 1970-01-01
相关资源
最近更新 更多