从列表到元组

From list to tuple

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

row是一个列表(它来自csvreader)

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?使用格式是最好的方法吗?

当然可以。

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

主要是个人喜好问题。一方面,我总是更喜欢使用 format 而不是 c 风格的格式化语法。

不确定它是否快得多,但是在这里可以在 join 中使用 map,这避免了列表理解并且不需要 lambda

", ".join(map("{} text".format,row))

你可以这样写:

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

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

您说您使用的是 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 快,但它不太可能显着加快您的程序速度。通常字符串格式不是瓶颈。