把两个三元运算符压缩成一个单行线?

2024-10-01 13:36:11 发布

您现在位置: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 ' '

Tags: 文件csvinif字典notupperelse
2条回答

参见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

你可以试试这个:

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

相关问题 更多 >