how to write if and else in a single line in python

Possible Duplicate:
Ternary conditional operator in Python

I am working on python and trying to save data in to database Suppose i had below code

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!!!!"

Here in the above code i am taking the strings from the list if they are not equal to empty string, because during slicing if there is no string it will display list index out of range error.

So is there any way to write these if and else statements in one line and submitting as value to query directly something like below(just given as an idea)

        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 ''

You can use the ternary expression (v2.5) from this SO answer. But instead I would recommend:

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())

Explanation:

In answer to your modified question where you test ex_li[0] and then assign its value, there is no point in check for blank and assigning it if you find it, you can just do:

 campaignID = ex_li[0]

Then if ex_li[0] is '' , that's what you'll get in campaignID . You mention list index out of bounds , but that will not happen in the updated code unless your list is the wrong length.

But at a higher level you can remove these if statements entirely:

(campaignID, keywordID, ...) = ex_li

This is tuple unpacking. Alternatively build a dictionary, which seems more useful since you need to treat the IDs as both data and selector:

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

And you can construct your query appropriately:

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

A refinement might be that if you get None instead of an empty string (which will become 'None' as a string), then modify the value read for the zip:

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

That should give you the empty string instead of 'None'.

If thg435 is right that you sometimes get a shorter list back, then you can zip in some extra '' :

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

Here the repeat will give an endless list of '' , and the chain will take elements from ex_li until it runs out, then start getting '' from the repeat . zip runs until one or other iterator runs out, so it will stop when names is exhausted. Alternatively, if you'd rather handle the None values separately, you can 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 + ')...'

or to ease readability:

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

However, don't do that. Use cursor.execute in the DB API rather than quoting values yourself, as many SO questions attest (eg Python: get escaped SQL string):

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

This allows the DB API to do the escaping correctly for you, preventing injection attacks or accidents.


你可以尝试如下所示:

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

上一篇: “else if”比“switch()case”更快吗?

下一篇: 如何写python中的if和else