【发布时间】:2021-10-23 03:04:58
【问题描述】:
在 pandas Dataframe 中,我正在检查 a 变量是否在字典的值中,如果是则返回键。否则返回值。
def getModelType(row):
for key, value in models.items():
if row.MODEL in value:
return key
return row.MODEL
我正在尝试清理代码并用简写形式编写表达式:
return key for (key,value) in models.items() if row.MODEL in value else row.MODEL
我不断收到语法错误。 可以缩短吗?
【问题讨论】:
-
你需要一个
next来从迭代器中获取第一个值。 -
听起来像XY problem。你实际上想做什么(在更大的背景下)?请提供完整的minimal reproducible example。
-
您可以修复您的“速记”,但它不会“清理代码”。恰恰相反。
-
@PierreD 我正在尝试检查数据框中的值是否是一种产品。表中产品由型号描述。我创建了一个包含所有产品类型及其型号的字典,例如:{'Dog': ['Labrador', 'German Sheppard', 'Poodle'], 'Cat':['Scottish fold', 'Persian ']} 如果 row.MODEL 中的值是“拉布拉多”,我希望它返回“狗”。我的问题纯粹是关于我的函数的速记。
-
你的“速记”很难修复,在任何情况下都不会清理代码也不会加快速度。我正在考虑的一种可能性是
return next(key for key, value in models.items() if row.MODEL in value) or row.MODEL,但是一个空迭代器的next()(如果没有匹配项,就是你得到的)引发StopIteration。另一种可能性是return ([key for key, value in models.items() if row.MODEL in value] + [row.MODEL])[0]。它是单行的,但它很丑陋,而且几乎不是“速记”。而且它并不能解决整体解决方案比它需要的速度慢的问题。
标签: python python-3.x conditional-operator shorthand