【问题标题】:Iterating in lists of different lengths迭代不同长度的列表
【发布时间】:2018-02-02 22:42:02
【问题描述】:

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

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],它说索引超出范围,因为我有一些只有一个元素的列表。而且由于列表的长度都不同,我需要使其足够通用,以便它始终可以处理每个列表具有多少元素。

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

【问题讨论】:

  • 小提示:修改查询时使用准备好的语句而不是字符串格式。

标签: python mysql list index-error


【解决方案1】:
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 不允许单个列中有多个值。

【讨论】:

    【解决方案2】:

    第一个示例将为您提供字典中每个值的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)
    

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 2017-10-15
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多