从列表到元组

时间:2017-09-27 14:40:57

标签: python string string-formatting list-comprehension python-3.6

我正在尝试改进此code以使其在Python 3.6中更有效。

row是一个列表(来自csv读者)

sql = "CREATE TABLE %s (%s)" % (tablename,", ".join([ "%s text" % column for column in row ]))

我不确定这是否是最好的方法,但到目前为止我能够通过替换前两个%s而不是第三个来改进代码。

query = 'CREATE TABLE  {0} ({1})'
sql = query.format(tablename, ", ".join([ "%s text" % column for column in row ]))  

是否可以替换第三个%s?使用格式是最好的方法吗?

4 个答案:

答案 0 :(得分:1)

当然,这是可能的。

sql = "CREATE TABLE {0} ({1})".format(tablename,
                                      ','.join(["{} text".format(column) for column in row])

大多数情况下,这是个人偏好的问题。就我而言,我总是喜欢使用format而不是c风格的格式化语法。

答案 1 :(得分:0)

不确定它的速度要快得多,但在join中使用lambda是可行的,这样可以避免列表理解,并且不需要", ".join(map("{} text".format,row)) :< / p>

Product

答案 2 :(得分:0)

你可以写成:

sql = "CREATE TABLE %s (%s text)" % (tablename, " text, ".join(row))

注意:最后一列名称需要 text

答案 3 :(得分:0)

你说你正在使用Python 3.6,所以你可以使用3.6 f-strings(它们像format一样工作)使其更快 1 更短。

对于你的例子:

columns = ", ".join([f"{column} text" for column in row])
query = f'CREATE TABLE {tablename} ({columns})'

请注意,这种进行SQL查询的方式使您容易受到SQL-injection的攻击。您可能应该使用预准备语句而不是格式化来创建查询。

1 它们比%format快,但它不太可能显着加快您的程序速度。通常字符串格式化不是瓶颈。