将两个三元运算符压缩成一个单线程?

时间:2015-06-25 16:59:40

标签: python

我正在解析包含重叠字段的多个csv。我首先尝试检查正在解析的csv中是否存在字段,然后检查字典中是否存在该值。如果该值尚未存在,那么我想将该值附加到字典中,以便稍后我可以将所有唯一值写入单独的文件。 我需要减少这个:

if 'ZIPCODE' in row: ZipCode = row['ZIPCODE'].upper()
else: ZipCode = ' ' 

并被定向到三元运营商:

ZipCode = row['ZIPCODE'].upper() if 'ZIPCODE' in row else ' '

第二项检查是Dict的if else:

FieldDict['ZipList'].append(ZipCode) if ZipCode not in FieldDict['ZipList'] else ' ' 

我的问题是,有没有办法将这两个比较合并为一个声明?或者,有没有更好的方法来检查csv和字典中的唯一性。

****想出了****

FieldDict['ZipList'].append(row['ZipCode'].upper()) if 'ZipCode' in row else ' ' if row['ZipCode'] not in FieldDict['ZipList'] else ' '

2 个答案:

答案 0 :(得分:3)

参见Python "Conditional Expressions"

ZipCode = row['ZIPCODE'].upper() if 'ZIPCODE' in row else ' ' 


模拟三元运算符的另一种方法是:

ZipCode = [' ', row['ZIPCODE'].upper()]['ZIPCODE' in row]

编辑:第二种方法无法正常工作,因为'ZIPCODE'可能不在行中,因此无法创建第一个列表并引发错误。这是愚蠢的。

正如马库斯所说,dictionnary get method()非常适合解决这个问题。

row.get('ZIPCODE', ' ').upper()

关于Kasra评论,这里有一点timeit表明他是对的:

>>> timeit.timeit('["No", "Yes"][50 in range(100)]', number=1000000)
2.7500426138772203
>>> timeit.timeit('"Yes" if 50 in range(100) else "No"', number=1000000)
2.2611985253367393

答案 1 :(得分:2)

你可以试试这个:

zipcode = row['ZIPCODE'].upper() if 'ZIPCODE' in row else ' '