要存储在MongoDB中的列表列表

时间:2014-10-16 01:40:42

标签: python python-2.7 pymongo

我有一个列表,我存储在嵌套的defaultdict

from collections import defaultdict

if __name__ == "__main__":

r = [["Test", "A", "B01", 828288,  1,    7, 'C', 5],
    ["Test", "A", "B01", 828288,  1,    7, 'T', 6],
    ["Test", "A", "B01", 171878,  3,    8, 'C', 5],
    ["Test", "A", "B01", 171878,  3,    8, 'T', 6],
    ["Test", "A", "B01", 871963,  3,    9, 'A', 5],
    ["Test", "A", "B01", 871963,  3,    9, 'G', 6],
    ["Test", "A", "B01", 1932523, 1,   10, 'T', 4],
    ["Test", "A", "B01", 1932523, 1,   10, 'A', 5],
    ["Test", "A", "B01", 1932523, 1,   10, 'X', 6],
    ["Test", "A", "B01", 667214,  1,   14, 'T', 4],
    ["Test", "A", "B01", 667214,  1,   14, 'G', 5],
    ["Test", "A", "B01", 667214,  1,   14, 'G', 6]]

s = defaultdict(lambda:
        defaultdict(lambda:
                defaultdict(lambda:
                    defaultdict(lambda:
                            defaultdict(lambda:
                                defaultdict(lambda:
                                        defaultdict(defaultdict)))))))

for i in r:
    s[i[0]][i[1]][i[2]][i[3]][i[4]][i[5]][i[6]] = i[7]

但是,我不确定如何将上面嵌套的defaultdict转换为Dict / JSON(见下文),以便将其存储到MongoDB中。

{
type: "Test", 
name: "A", 
sub_name: "B01", 
pos: 828288,  
s_type: 1,    
x_type: 7, 
chr = {
      'C': 5
      'T': 6
      }
}

是否有办法避免创建嵌套的defaultdict并将每个元素直接存储到MongoDB并应用更新?

更新:对于第一个列表,它应该是'chr': { 'i[6]': i[7]},应该提供'chr': { 'C': 5}。 对于第二个列表,与第一个列表相比,后两个元素只有不同。 我想将'T', 6添加到之前的chr以获取'chr': { 'C': 5, 'T', 6}。 我创建了嵌套的defaultdict,以便组合相同的元素和最后两个不同的元素,我想将它们存储在chr dict中。

2 个答案:

答案 0 :(得分:1)

您为什么要创建嵌套的defaultdict结构?您是否需要快速查找每个密钥?如果您在Mongo中保存,为什么不让Mongo通过为重要字段创建索引来为您执行查找。

我只想做以下事情:

r = [["Test", "A", "B01", 828288,  1,    7, 'C', 5],
    ["Test", "A", "B01", 828288,  1,    7, 'T', 6],
    ["Test", "A", "B01", 171878,  3,    8, 'C', 5],
    ["Test", "A", "B01", 171878,  3,    8, 'T', 6],
    ["Test", "A", "B01", 871963,  3,    9, 'A', 5],
    ["Test", "A", "B01", 871963,  3,    9, 'G', 6],
    ["Test", "A", "B01", 1932523, 1,   10, 'T', 4],
    ["Test", "A", "B01", 1932523, 1,   10, 'A', 5],
    ["Test", "A", "B01", 1932523, 1,   10, 'X', 6],
    ["Test", "A", "B01", 667214,  1,   14, 'T', 4],
    ["Test", "A", "B01", 667214,  1,   14, 'G', 5],
    ["Test", "A", "B01", 667214,  1,   14, 'G', 6]]

for i in r:
    d = {
        'type': i[0],
        'name': i[1],
        'sub_name': i[2],
        'pos': i[3],
        's_type': i[4],
        'x_type': i[5],
        'chr': { 'C': i[6], 'T': i[7]}
    }
    #now save dictionary "d" into mongo.

答案 1 :(得分:0)

解决方案:

#!/usr/bin/env python

from pymongo import MongoClient
from collections import defaultdict



db = MongoClient().test
sDB = db.sss

r = [["Test", "A", "B01", 828288,  1,    7, 'C', 5],
    ["Test", "A", "B01", 828288,  1,    7, 'T', 6],
    ["Test", "A", "B01", 171878,  3,    8, 'C', 5],
    ["Test", "A", "B01", 171878,  3,    8, 'T', 6],
    ["Test", "A", "B01", 871963,  3,    9, 'A', 5],
    ["Test", "A", "B01", 871963,  3,    9, 'G', 6],
    ["Test", "A", "B01", 1932523, 1,   10, 'T', 4],
    ["Test", "A", "B01", 1932523, 1,   10, 'A', 5],
    ["Test", "A", "B01", 1932523, 1,   10, 'X', 6],
    ["Test", "A", "B01", 667214,  1,   14, 'T', 4],
    ["Test", "A", "B01", 667214,  1,   14, 'G', 5],
    ["Test", "A", "B01", 667214,  1,   14, 'G', 6]]

for i in r:
    d = {
    'type': i[0],
    'name': i[1],
    'sub_name': i[2],
    'pos': i[3],
    's_type': i[4],
    'x_type': i[5],
    'chr': { i[6]: i[7]}
    }
    sDB.update({"x_type": i[5]}, {"$push": {"chr":{i[6]: i[7]} }}, True)