У меня есть список
uids: ['1234','4321','1111']
и я хотел бы превратить это в одну строку:
"uid = '1234' OR uid = '4321' OR uid = '1111'"
Какой самый эффективный способ сделать это? Спасибо!
Если, как упоминают Майк и Томас в комментариях, вам нужно это для запроса к базе данных, вы должны взять совет Томаса и использовать DB-API.
Вот два примера:
MySQL
import MySQLdb
conn = MySQLdb.connect(host='localhost', user='u', passwd='p', db='mydb')
curs = conn.cursor()
uids = [1234,4321,1111]
qry = ("""SELECT cheese
FROM cheeseshop
WHERE id IN (%s)""" % ','.join(['%s']*len(uids)))
# 'SELECT cheese FROM cheeseshop WHERE id IN (%s,%s,%s)'
curs.execute(qry, uids)
curs.fetchone()
# ...
SQLite
import sqlite3
conn = sqlite3.connect(':memory:')
curs = conn.cursor()
uids = [1234,4321,1111]
qry = ("""SELECT cheese
FROM cheeseshop
WHERE id IN (%s)""" % ','.join('?'*len(uids)))
# 'SELECT cheese FROM cheeseshop WHERE id IN (?,?,?)'
curs.execute(qry, uids)
curs.fetchone()
# ...
' OR '.join("uid = '%s'" % u for u in uids)
Это вызывает функцию join
в строке ' OR '
, которая принимает список, переданный и помещает строку между каждым элементом, а затем объединяет их все вместе. (Используется для размещения ORs между каждой парой key = val.)
Часть внутри ()
- это понимание, которое говорит "для каждого u
в списке uids
, генерирует значение, равное строке "uid = '%s'"
, но вместо u
вместо %s
marker".
qmark
qmark) в вашем операторе SQL, по одному для каждого идентификатора пользователя, разделенных OR, как указано выше, и передачи списка идентификаторов (вместе с любыми другими параметрами) в метод execute
. Таким образом, вам не придется беспокоиться о правильном цитировании.