将复杂词典插入sqlite数据库?

时间:2014-09-26 03:24:25

标签: python sqlite dictionary

我有一个遵循以下结构的字典:

mydict = {0: {10001: {'simple': 1, 'example': 2}, 10002: {'simple': 2, 'example': 1}}, 1: {20002: {'simple': 0, 'example': 2}}}

顶级密钥与sqlite db无关,但10001,10002,20002密钥都表示同一个表中的主键,其附加的字典也包含要插入的属性。我提出的方法是:

top_level_keys = mydict.keys()
list_of_lists = []    
for key in top_level_keys:
    primary_keys = mydict[key].keys()
    for k in primary_keys:    
        list_of_lists.append([k, mydict[key][k]["example"],mydict[key][k]["simple"]])

这给了我一个简单插入所需顺序的所有记录列表:

[[10001, 2, 1], [10002, 1, 2], [20002, 2, 0]]

但是,添加到表中的列越多, list_of_lists.append ... 语句变得越久 - 此时它大约为30。我也可以迭代这些键,但是会失去sqlite插入的顺序。

有更简单/更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您可以提前指定您的钥匙/订单作为清单:

my_ordered_fields = ['example','simple'] #or ['example','simple','next','more next','..etc..']

另请注意,您可以通过直接迭代键而不是声明其值来压缩代码。

list_of_lists = []    
for key in mydict.keys():
    for k in mydict[key].keys():
        this_entry = [k]
        for ordered_field in my_ordered_fields:
            this_entry.append(mydict[key][k][ordered_field])   
        list_of_lists.append(this_entry)

很难简化它,因为如果您希望按特定顺序返回字段,则必须始终以某种方式指定其名称和顺序。

如果想要稍微压缩代码,你也可以使用一些列表推导,尽管肯定是以可读性/透明度为代价的。

sub_dicts = [lower_dict for lower_dict in mydict.values()]
list_of_lists = [[[lower_key]+[lower_dict[my_field] for my_field in my_ordered_fields] for lower_key,lower_dict in sub_dict.items()] for sub_dict in sub_dicts]