如何写python中的if和else

可能重复:
Python中的三元条件运算符

我正在研究python并试图将数据保存到数据库中假设我有下面的代码

conn = mdb.connect(user='root', passwd='redhat', db='Data', host='localhost', charset="utf8")

ex_li = ['stri_one','stri_two','stri_three','stri_four']

if ex_li[0] != '':
    campaignID = ex_li[0]
else:
    campaignID = ''

if ex_li[1] != '':
    keywordID = ex_li[1]
else:
    keywordID = ''
.........
.......

try:
    cursor = conn.cursor()
    query = "insert into PerformaceReport(campaignID, keywordID, keyword, avgPosition,cost)"
    query += "VALUES (%s, '%s', '%s', '%s')" %(campaignID, keywordID, keyword, avgPosition,cost)
    cursor.execute( query )
    conn.commit()
except Exception as e:
    print e,"!!!! Exception happend!!!!"

在上面的代码中,我从列表中取出字符串,如果它们不等于空字符串,因为在切片过程中如果没有字符串,它将显示list index out of range错误。

那么有什么方法可以将这些if和else语句写在一行中,并将其作为值直接提交给下面的内容(只是作为一个想法给出)

        query += "VALUES (%s, '%s', '%s', '%s')" %(if ex_li[0] != '': campaignID = ex_li[0]  else: campaignID = '' ............)

expression_if_true if condition else expression_if_false

所以试试

campaignID = main_res[0] if ex_li[0] != '' else ''

你可以使用这个SO答案中的三元表达式(v2.5)。 但是,我会建议:

names = ['campaignID', 'keywordID' ... ]  
data = itertools.izip_longest(names, ex_li)
key_string = ','.join(data.keys())
query = '...(' + key_string + ')...( %s, %s, %s, %s )' #no % here
cursor.execute(query, data.values())

说明:

回答你在测试ex_li[0]地方修改后的问题,然后分配它的值,如果你发现它,就没有必要检查空白并指定它,你可以这样做:

 campaignID = ex_li[0]

然后,如果ex_li[0]'' ,那么您将在campaignID获得。 你提到了list index out of bounds ,但除非你的列表长度错误,否则这不会发生在更新后的代码中。

但是在更高层次上,您可以完全删除这些if语句:

(campaignID, keywordID, ...) = ex_li

这是元组拆包。 另外建立一个字典,这看起来更有用,因为你需要将ID同时作为数据和选择器:

names = ['campaignID', 'keywordID' ... ]  
data = zip(names, ex_li)
# now have data = {'campaignID': ex_li[0], ... }

你可以适当地构建你的查询:

query = 'insert into Performance report (' + ','.join(data.keys()) + ') ' +
        'values (' + ','.join("'"+elem+"'" for elem in data.values()) + ')'

一个细化可能是,如果你得到None而不是空字符串(它将变成'None'作为字符串),那么修改为zip读取的值:

data = zip(names, (elem or '' for elem in ex_li))

这应该给你空字符串,而不是'无'。

如果thg435是正确的,你有时会得到一个更短的名单,那么你可以压缩一些额外的''

data = zip(names, itertools.chain((elem or '' for elem in ex_li),
            itertools.repeat('')))

这里的repeat会给出一个无尽的''列表,并且chain将从ex_li获取元素,直到它耗尽,然后开始从repeat获得''zip运行,直到一个或其他迭代用完,所以当它停止names被耗尽。 或者,如果您希望单独处理None值,则可以使用izip_longest

data = itertools.izip_longest(names, ex_li)
key_string = ','.join(data.keys())
value_string = ','.join("'"+str+"'" for str in 
    (elem or '' for elem in data.values()))
query = '...(' + key_string + ')....(' + value_string + ')...'

或者为了减轻可读性:

def quotify(str):
    return "'"+str+"'"

但是,不要这样做。 在DB API中使用cursor.execute,而不是自己引用值,正如许多SO问题所证明的那样(例如,Python:获得转义的SQL字符串):

query = '...(' + key_string + ')...( %s, %s, %s, %s )' #no % here
cursor.execute(query, data.values())

这使得DB API可以正确地为您进行转义,防止注入攻击或事故。


你可以尝试如下所示:

value_when_true if condition else value_when_false
链接地址: http://www.djcxy.com/p/7403.html

上一篇: how to write if and else in a single line in python

下一篇: Is There '?' Control Flow in Python?