python - 展平和解压缩列表

时间:2012-09-20 15:52:17

标签: python sqlite flatten

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

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 个答案:

答案 0 :(得分:4)

您可以使用ravel制作array2array3 1维:

In [149]: import itertools

In [150]: list(itertools.chain(list1, array2.ravel(), array3.ravel()))
Out[150]: [1, 10, 0, 1, 2, 0, 1]

答案 1 :(得分: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)

答案 2 :(得分: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)

答案 3 :(得分: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)