python - 迭代不同长度的列表

标签 python mysql list index-error

我正在尝试使用 Python 从字典中向 MySQL 表添加数据。我的字典由与不同长度的值列表关联的键组成——长度从 1 到 150 左右不等。我正在使用插入语句将我的数据插入表中,其中键是字段名称。这就是我希望 sql 插入语句基本上是这样的:

INSERT INTO table
(key1, key2, key3, ...)
VALUES
(key1value1, key2value1, key3value1, ...),
(key1value2, key2value2, key3value2, ...),
(key1value3, key2value3, key3value3, ...);

等等,但我也可以做一个 for 循环,以便每组值有一个插入语句。这是我的列表的第一个元素:

cols = dict.keys()
vals = dict.values()
lst = [item[0] for item in vals]
sql = "INSERT INTO table (%s) VALUES (%s);" % (','.join(map(str, cols[:len(cols)])), "'{}'".format("','".join(lst)))
cursor.execute(sql)

这很有效,有效地将我的第一组数据插入到我表中的一个新行中。但问题是当我尝试增加 lst 中的索引时,例如增加到 item[1],它说索引超出范围,因为我有一些列表只有一个元素。由于列表的长度各不相同,因此我需要使其足够通用,以便它始终适用于每个列表包含的元素数量。

如果某些列表的索引在增加时超出范围,那么我希望它跳过那些但继续插入其余部分。我该怎么做?

最佳答案

第一个示例将为您提供字典中每个值的第 个元素,当最短列表用完时完全停止。

第二个示例将继续,并且只在一个列表太短的地方使用 None 值。

from itertools import zip_longest

d = {'k1':[1,2,3],
     'k2':[1,2,3,4,5,6],
     'k3':[1,8]}

for k in d.keys():
    for v in zip(*d.values()):
        print(k,v)

for k in d.keys():
    for v in zip_longest(*d.values()):
        print(k,v)

关于python - 迭代不同长度的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45871944/

相关文章:

python - 将日期转换为 %Y :%j:%H:%M:%s in python with date command

python - 列出二维数组 numpy 中具有特定值的所有 x,y 坐标

python - 如何在不更改原始字典的情况下将值分配给重复字典中的列表

c - 反向打印双向链表,仅打印第一个元素

python - 使用 ZeroMQ 实现多线程服务器

python - 将 a(字符串或整数)划分为 min(长度或值)为 2 的 n 个元素

mysql - zend 数据库查询限制未按预期工作

mysql - 如何根据另一个表中的值动态更新一个表中的sql列

带有引发触发器的插入的 MySQL 死锁

python - 使用 if no in == False 存储唯一字符串