1

这是我的一些代码,它们真的很难看,我希望有人能告诉我如何让它变得更好。我隐约知道如何修复此代码,但在实践中无法获得任何改进。

list1 = ([1, 10])
array2 = numpy.ones((1,3))
array3=numpy.ones((1,2))

conn = sqlite3.connect("a.db")
c = conn.cursor()
c.execute("insert into a_table values(?, ? , ?, ?, ?, ?, ?)", (list1[0], list1[1], array2[0][0], array2[0][1], array2[0][2], array3[0][0], array3[0][1]))
#

我认为我需要做的是将list1、array2 和array3 附加到一个列表中,然后以某种方式将其展平。然后以某种方式用一个命令将整个列表解压缩到表中......谢谢!

4

4 回答 4

4

您可以使用ravel制作array2array3维:

In [149]: import itertools

In [150]: list(itertools.chain(list1, array2.ravel(), array3.ravel()))
Out[150]: [1, 10, 0, 1, 2, 0, 1]
于 2012-09-20T16:04:08.510 回答
2

刚刚通过将数组转换为一维列表来构建一个新列表:

c.execute("insert into a_table values(?, ? , ?, ?, ?, ?, ?)", 
    list1 + list(array2[0]) + list(array3[0]))            

或者,您可以使用.ravel()创建一维数组:

c.execute("insert into a_table values(?, ? , ?, ?, ?, ?, ?)", 
    list1 + list(array2.ravel()) + list(array3.ravel()))            

如果参数的数量是可变的,您也可以生成占位符参数:

from itertools import chain
params = list(chain(list1, array2.ravel(), array3.ravel()))

c.execute("insert into a_table values(%s)" % (', '.join(('?',) * len(params),),
    params)
于 2012-09-20T15:56:13.390 回答
0

我认为,如果您不循环执行此操作, itertools.chain() 不会为您带来任何好处。根据您的输入,这是一些简单的事情:

list1=([1,10])
array2 = numpy.ones((1,3))
array3 = numpy.ones((1,2))

args=list1 + list(*array2) + list(*array3)
# [1, 10, 1.0, 1.0, 1.0, 1.0, 1.0]
conn = sqlite3.connect("a.db")
c = conn.cursor()
c.execute("insert into a_table values(?, ? , ?, ?, ?, ?, ?)",*args)
于 2012-09-20T16:41:20.597 回答
0
>>> from itertools import chain
>>> master_l = list(array2)+list(array3)
>>> list1.extend(chain(*master_l)
... )
>>> list1
[1, 10, 1.0, 1.0, 1.0, 1.0, 1.0]

>>> c.execute("insert into a_table values(?, ? , ?, ?, ?, ?, ?)",list1)
于 2012-09-20T16:02:04.477 回答