Python 连接字符串列表,使每个字符串都包含在引号内,并以逗号分隔

Python 连接字符串列表,使每个字符串都包含在引号内,并以逗号分隔,python,Python,假设我有一个客户名单: lst = ['John','Jack','Martin'] 变量中所需的输出:'John'、'Jack'、'Martin' 我可以使用类似于“,”.join(lst)的东西,然后使用更多的字符串格式来实现这一点。有没有更明确、更直接的方法 我的想法是在SQLwhere子句中传递字符串的元素。Donot将其用于SQL查询生成。改用数据库驱动程序SQL参数。否则,您就不能指望正确地逃脱SQL注入攻击 如果需要使用WHERE。。在..test中,生成占位符: query =

假设我有一个客户名单:

lst = ['John','Jack','Martin']
变量中所需的输出:
'John'、'Jack'、'Martin'

我可以使用类似于
“,”.join(lst)
的东西,然后使用更多的字符串格式来实现这一点。有没有更明确、更直接的方法


我的想法是在SQL
where
子句中传递字符串的元素。

Donot将其用于SQL查询生成。改用数据库驱动程序SQL参数。否则,您就不能指望正确地逃脱SQL注入攻击

如果需要使用
WHERE。。在..
test中,生成占位符:

query = 'SELECT * FROM table WHERE column IN ({})'.format(','.join(['%s'] * len(lst)))
cursor.execute(query, lst)
对于其他内容,请使用列表理解将引号添加到值中,然后使用逗号连接结果:

', '.join(['"{}"'.format(value) for value in lst])
演示:


这将始终使用
双引号;只需使用
”{}”“
作为模板,如果您必须使用单引号代替。

如果您要将其传递给SQL,并且它是用户提供的数据,您应该查看一个模块,该模块将为您处理正确的引号/参数化,例如Postgres的
psycopg2
。我相信MySQL也有类似的功能

使用像
str.join
这样的简单技术可能会让您面临SQL注入攻击,除非您在将结果提交给SQL之前非常小心地检查结果

如何在
psycopg2
中执行此操作的示例:


作为一个副作用,它还可以为您处理类型,即它知道将整数作为数字传递,将字符串作为带引号的字符串传递,等等。

步骤1。实际上,更改列表的每个元素,使其带有引号(如果不是字符串,请将其转换为字符串)

第二步。用逗号连接每个元素

','.join(lst)
pythonshell的输出
如果您使用的是符合odbc的数据库。 摘自文件:

cursor.execute(
"""
选择用户id、用户名称
来自用户
上次登录在哪里?
而比尔·欧逾期=?
""", '2001-01-01', 1)
要使用列表,请执行以下操作:

cursor.execute(
    """
    select user_id, user_name
      from users
     where last_logon < ?
           and bill_overdue = ?
    """, lst)
cursor.execute(
"""
选择用户id、用户名称
来自用户
上次登录在哪里?
而比尔·欧逾期=?
“”,lst)

您可以使用
repr
使每个字符串成为有效的Python输入:

lst = ['John','Jack','Martin']
output = ','.join(map(repr,lst))

要获得所需的输出,您仍然可以使用
join
,如下所示:

lst = ['John','Jack','Martin']
print "'"+"','".join(lst)+"'"
这将显示:

'John','Jack','Martin'
或者,您可以使用
format()
避免字符串串联:

print "'{}'".format("','".join(lst))

尽管如此,请注意其他人关于它与SQL的使用的评论。

任何python的等价物。内爆(“,”,$array)。“”将是。。。但请注意,这会使您面临sql注入攻击。为什么要使用列表?我看到有人认为它更快(这可能是真的),但这种特定的优化非常特定于
str.join
,而且对于大多数应用程序来说,加速几乎可以忽略不计。。。除非我能证明两者之间存在差异,否则我宁愿使用generate here来与传递genenerators的其他函数保持一致(例如,
sum
)@mgilson:它更快,因为生成器表达式也被转换为列表。
str.join()
调用必须在字符串上迭代两次。看雷蒙德·海廷格的回答:当然——我并不是说它不会更快。Raymond引用的数字将加速比放在10-15%左右,这可能不会对程序的总运行时间产生任何可测量的影响,除非这是一个非常紧密的循环。我想我的问题是,与需要记住
str.join
的特殊情况相比,你是否认为加速是值得的——我的直觉告诉我要避免使用特殊的外壳,但我只是一个人,我的意见可能没什么关系:-)。@mgilson我已经习惯于记住这一点,现在认知成本接近零。在这一点上,不使用列表comp需要更多的努力。我不再认为这是一个特例。但那只是我。FWIW,我刚刚重复了Raymond用pypy做的实验,差异更大(~一个2倍的差异)。因此,较慢的(生成器)pypy版本的速度大约是较快的python版本(list comp)的3倍。这确实让我怀疑这个特殊案例是否值得采用。我很想得到社区对这一点的意见,但是,唉,像这样的问题可能会在2分钟内解决(特别是如果我是发布它的人;-)。请确保单元测试涵盖所有可能的SQL注入情况-您可能需要一个特定于SQL的函数来代替
repr
,或者(更可能)使用参数化查询而不是文本替换。
lst = ['John','Jack','Martin']
output = ','.join(map(repr,lst))
lst = ['John','Jack','Martin']
print "'"+"','".join(lst)+"'"
'John','Jack','Martin'
print "'{}'".format("','".join(lst))