迭代不同长度的列表

时间:2017-08-24 22:39:29

标签: python mysql list index-error

我试图使用字典中的Python将数据添加到MySQL表中。我的字典由与不同长度的值列表相关联的键组成 - 长度从1到150左右。我使用insert语句将我的数据插入表中,其中键是字段名称。这就是我基本上喜欢sql insert语句:

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

依此类推,但我也可以做一个for循环,以便每组值都有一个insert语句。以下是我列表中第一个元素的内容:

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中的索引时,例如项目[1],它表示索引超出范围,因为我有一些列表只有一个元素。由于列表都是不同的长度,我需要使它足够通用,以便它总是适用于每个列表有多少元素。

如果索引超出某些列表的范围,因为它增加了,我希望它跳过这些但继续插入其余列表。我该怎么做?

2 个答案:

答案 0 :(得分:0)

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

第二个示例将继续运行,只使用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)

答案 1 :(得分:0)

data = { 'a': [1], 'b': [1, 2], 'c': [1, 2, 3] }

keys = ', '.join(data.keys())
values = ', '.join('(' + ', '.join(v) + ')' for v in (map(str, value) for value in data.values()))

print(keys)
print(values)

产地:

a, b, c
(1), (1, 2), (1, 2, 3)

我非常确定SQL不允许在单个列中使用多个值。

相关问题