如何将列表放在列表中,将它们作为'元组'

时间:2015-03-31 21:59:14

标签: python sqlite

在Pythons SQLite文档中,我们有以下关于如何将许多值放入SQL数据库的示例:

purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
             ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00),
             ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
            ]
c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases) 

但是,如果我有一个包含日期的列表,一个包含买/卖,一个包含股票代码,一个包含金额和一个价格,在插入之前如何以最佳方式组合它们?我已经尝试循环遍历每个列表并将它们逐个插入SQLite DB中,但这需要花费很多时间。

dates = ['2006-03-28', '2006-04-05', '2006-04-06']
flags = ['buy', 'buy', 'sell']
tickers = ['IBM', 'MSFT', 'IBM']
amount = [1000, 1000, 500]
price = [45.00, 72.00, 53.00]

这需要太长时间:

for i in range(0, len(dates)):

    c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', dates[i], flags[i], tickers[i], amount[i], price[i])

1 个答案:

答案 0 :(得分:4)

您可以使用zip() function来转置适合executemany()的输入列表:

rows = zip(dates, flags, tickers, amount, price)
c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', rows)

该函数将每个列表中的元素配对成一个新元组;每个第一个元素组成一个元组,每个第二个元素组合成一个元组等。

演示:

>>> from pprint import pprint
>>> dates = ['2006-03-28', '2006-04-05', '2006-04-06']
>>> flags = ['buy', 'buy', 'sell']
>>> tickers = ['IBM', 'MSFT', 'IBM']
>>> amount = [1000, 1000, 500]
>>> price = [45.00, 72.00, 53.00]
>>> rows = zip(dates, flags, tickers, amount, price)
>>> pprint(rows)
[('2006-03-28', 'buy', 'IBM', 1000, 45.0),
 ('2006-04-05', 'buy', 'MSFT', 1000, 72.0),
 ('2006-04-06', 'sell', 'IBM', 500, 53.0)]
>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> conn.execute('''
... CREATE TABLE stocks (
...     date datetime,
...     action string,
...     symbol string,
...     quantity integer,
...     price real)
... ''')
<sqlite3.Cursor object at 0x10667bc70>
>>> cursor = conn.cursor()
>>> cursor.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', rows)
<sqlite3.Cursor object at 0x10667bce0>
>>> conn.commit()
>>> for row in cursor.execute('SELECT * FROM stocks'):
...     print(row)
... 
(u'2006-03-28', u'buy', u'IBM', 1000, 45.0)
(u'2006-04-05', u'buy', u'MSFT', 1000, 72.0)
(u'2006-04-06', u'sell', u'IBM', 500, 53.0)