【问题标题】:List inside a List using python and Database使用python和数据库在列表中列出
【发布时间】:2016-05-13 08:15:48
【问题描述】:

我希望创建一个类似 --

的文档
{ 
    "name" : "John" , 
    "DOB" : "21-Jun-1999" , 
    "Sex" : "M" ,
    "Skill" : ["C","PYTHON","COBOL"],
    "Location" : { "lat":12.3 , "Long" : "14.6" }
} 

我正在使用cx_oracle 从我的数据库中提取数据。 这是我的一小部分代码--

cur1.execute('select name,dob,sex,skills,long,lat from employee');    
# to create the keys             
for i in range(len(cur1.description)):
        head=cur1.description[i][0]
        header = header + [head]
for row in cur1.fetchall():
        data_dict={}
        for i in range(len(row)):
                if i == 3 :
                        c={}
                        c=row[i]
                        c=c.split(',')
                        for j in range(len(c)):
                       data_dict.setdefault(header[i],[]).append(c[j])       
                else:
                         data_dict.setdefault(header[i],[]).append(row[i])
print(data_dict) 

这是输出--

{
    "name" : "John" , 
    "DOB" : "21-Jun-1999" , 
    "Sex" : "M" ,
    "Skill" : ["C","PYTHON","COBOL"]
}

如何转换我的 SQL 中的最后两个字段(long 和 lat)并创建另一个列表。

【问题讨论】:

    标签: python json list document


    【解决方案1】:

    我没有安装 cx_oracle,所以没有测试,但是...

    从您想要的输出来看,您似乎希望 Location 字段的值是一个字典,而不是一个列表。鉴于此,假设 row 的索引 4 和 5 将始终分别代表您的 latlong 列,您可以执行以下操作:

    data_dict['Location'] = {'lat': row[4], 'long': row[5]}
    

    您的示例输出显示您希望经度为字符串,纬度为整数。我认为这是一个错字,但如果不是,您可以分别使用int(row[4])str(row[5]) 来确保这些值用于latlong。此外,如果您更喜欢使用列名作为 Location 字典的键,您可以将 latlong 分别替换为 header[4]header[5]

    您还必须更改循环以确保不会在 data_dict 中为 latlong 添加其他字段。并确保你对data_dict 做一些事情,这样它就不会在每次循环迭代后被破坏:

    对于 Python2.7 及更高版本:

    records = []
    for row in cur1.fetchall():
        data_dict = {header[i]: row[i] for i in range(len(row)) if i < 3}
        data_dict[header[3]] = row[3].split(',')
        data_dict[‘Location’] = {header[4]: row[4], header[5]: row[5]}        
        records.append(data_dict)
    

    对于 Python2.6 及之前版本:

    records = []
    for row in cur1.fetchall():
        data_dict = { 
            header[3]: row[3].split(',')
            'Location': {header[4]: row[4], header[5]: row[5]}
        }   
        for i in range(len(row)):
            if i < 3 : 
                data_dict[header[i]] = row[i]
    
       records.append(data_dict)
    

    对于它的价值,我相信cur1 是一个迭代器,你可以简单地做for row in cur1。当行数很多时,这将有助于减少内存使用量。

    【讨论】:

    • 太棒了!谢谢
    • @Judi,我很高兴这对您有所帮助。如果它回答了您的问题,您可以将此答案标记为已接受的答案吗?这有助于它显示给其他搜索类似问题的人。干杯。
    猜你喜欢
    • 2020-12-12
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 2022-07-22
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多