python 将字典转换为元组,其中每个值是一个列表,列表中的每个项是另一个字典

xzlaal3s  于 2023-01-29  发布在  Python
关注(0)|答案(2)|浏览(179)

我有一个字典,其中每个键是一个ID号,每个值是一个字典列表,所以它看起来像这样:{“身份证号”:[{“密钥1a”:“值1a”、“键2a”:“值2a”、“键3a”:'值3a'},{'键1b':“值1b”、“键2b”:“值2b”、“键3b”:'value 3b'}],'id number'...等。}列表中的字典键始终相同,并且这些字典中始终有3个项目,但是,这些列表的长度各不相同。,
我尝试做的是用psycopg 2把这个字典输入到PostgreSQL中。从我在文档中看到的,最好是以元组的形式输入,所以我尝试把这个信息转换成元组列表。诀窍是,我需要ID键保持不变,对于它配对的每个值字典项,它都是元组中的第一项。
因此,元组列表应该如下所示[(10001,1a,2a,3a),(10001,1b,2b,3b),(10002,...),等等。这样,如果我没有记错的话,表应该如下所示。
| 识别号|值1|值2|值3|
| - ------|- ------|- ------|- ------|
| 小行星|项目a|项目a|项目a|
| 小行星|B|B|B|
我试过这样的迭代:for key in dict: for i in key: print(i)(右缩进),但这只是打印id中的实际字符。任何帮助都将不胜感激。我可能使它比我需要的更复杂。

rur96b6h

rur96b6h1#

就我对问题陈述的理解而言,这是一个示例代码,我以你的示例输入作为参考,它是用python编写的。

d={111:[{'key1a': 'value1a', 'key2a': 'value2a', 'key3a': 'value3a'},{'key1b': 'value1b', 'key2b': 'value2b', 'key3b': 'value3b'}],222:[{'key1a': 'value1a', 'key2a': 'value2a', 'key3a': 'value3a'},{'key1b': 'value1b', 'key2b': 'value2b', 'key3b': 'value3b'}]}
result = [(int(key), *item.values()) for key, value in d.items() for item in value]
print(result)

输出:[(111,“值1a”,“值2a”,“值3a”),(111,“值1b”,“值2b”,“值3b”),(222,“值1a”,“值2a”,“值3a”),(222,“值1b”,“值2b”,“值3b”)]

dxpyg8gm

dxpyg8gm2#

修改dict以获取列表的列表。

d = {'10001':[{'key1': 'a', 'key2': 'a', 'key3': 'a'},{'key1': 'b', 'key2': 'b', 'key3': 'b'}],
     '10002': [{'key1': 'a2', 'key2': 'a2', 'key3': 'a2'},{'key1': 'b2', 'key2': 'b2', 'key3': 'b2'}, {'key1': 'c2', 'key2': 'c2', 'key3': 'c2'}]}

row_list = []
for id in d:
    for item in d[id]:
        item_list = []
        item_list.append(int(id))
        for ky in item:
            item_list.append(item[ky])
        row_list.append(item_list)
row_list
[[10001, 'a', 'a', 'a'],
 [10001, 'b', 'b', 'b'],
 [10002, 'a2', 'a2', 'a2'],
 [10002, 'b2', 'b2', 'b2'],
 [10002, 'c2', 'c2', 'c2']]

将数据插入表中

create table val (id integer, value1 varchar, value2 varchar, value3 varchar);

import psycopg2

con = psycopg2.connect(dbname="test", host='localhost', user='postgres', port=5432)
cur = con.cursor()
cur.executemany('insert into val values(%s, %s, %s, %s)', row_list)
con.commit()

select * from val;
  id   | value1 | value2 | value3 
-------+--------+--------+--------
 10001 | a      | a      | a
 10001 | b      | b      | b
 10002 | a2     | a2     | a2
 10002 | b2     | b2     | b2
 10002 | c2     | c2     | c2

上面使用的executemany伸缩性不好。如果你要插入大量的值,那么:

from psycopg2.extras import execute_batch
execute_batch(cur, 'insert into val values(%s, %s, %s, %s)', row_list)
con.commit()

这使用了Fast execution helpers中的execute_batch,它批量插入(在本例中)数据,而不是像executemany那样迭代数据。

相关问题