Python: 没有列表的小 for 语句
Python: Small for statement without list
我正在尝试优化我的代码。我正在努力使我的 for 语句尽可能短。问题是简写语句是(当然)"returning" 一个列表。我想要它 "return" 一个字符串。
b = [key2 for key2 in LUT_value.keys() if LUT_value[key2] == self.value]
Keys 是一个字符串,f.g 可以是 "Name"。问题是 b
变成:
b = ['Name']
我要返回 a + ' ' + b
,但这是行不通的。我怎样才能解决这个问题并仍然保留小声明?如果可以的话。
如果我正确理解你的问题。当你这样做时
b = [key2 for key2 in LUT_value.keys() if LUT_value[key2] == self.value]
你有一个只有一个字符串的列表?如果是这样的话:
b = [key2 for key2 in LUT_value.keys() if LUT_value[key2] == self.value][0]
您可以将 next
与生成器表达式一起使用:
b = next(key2 for key2 in LUT_value.keys() if LUT_value[key2] == self.value)
注意,如果值不存在,这将引发 StopIteration
。如果不能保证该值存在,则您需要捕获错误并对其进行处理(或者让它传播我想......)或者您可以为 next:
提供默认值
value_gen = (key2 for key2 in LUT_value.keys() if LUT_value[key2] == self.value)
some_default = 'Default Yeah!'
b = next(value_gen, some_default)
如果您需要先找到这样的匹配值,使用next()
function and a generator expression:
b = next((key2 for key2, value in LUT_value.items() if value == self.value), '')
这会生成您的第一个 key2
符合条件的值,如果没有这样的值,则生成一个空字符串。我使用 dict.items()
而不是循环 dict.keys()
,然后查找各个值。此外,遍历 dict.keys()
是多余的;如果您只想遍历键,只需直接遍历 dict
对象即可。
我想知道你是否应该存储一个 inverse 映射:
inverse_LUT_values = {value: key for key, value in LUT_value.items()}
然后只需使用:
b = inverse_LUT_values.get(self.value, '')
甚至
b = inverse_LUT_values[self.value]
与 inverse_LUT_values
存储以供重复使用。如果有多个具有相同值的键可以匹配,对您来说似乎无关紧要,因此反向映射只保留一个这样的键。
我正在尝试优化我的代码。我正在努力使我的 for 语句尽可能短。问题是简写语句是(当然)"returning" 一个列表。我想要它 "return" 一个字符串。
b = [key2 for key2 in LUT_value.keys() if LUT_value[key2] == self.value]
Keys 是一个字符串,f.g 可以是 "Name"。问题是 b
变成:
b = ['Name']
我要返回 a + ' ' + b
,但这是行不通的。我怎样才能解决这个问题并仍然保留小声明?如果可以的话。
如果我正确理解你的问题。当你这样做时
b = [key2 for key2 in LUT_value.keys() if LUT_value[key2] == self.value]
你有一个只有一个字符串的列表?如果是这样的话:
b = [key2 for key2 in LUT_value.keys() if LUT_value[key2] == self.value][0]
您可以将 next
与生成器表达式一起使用:
b = next(key2 for key2 in LUT_value.keys() if LUT_value[key2] == self.value)
注意,如果值不存在,这将引发 StopIteration
。如果不能保证该值存在,则您需要捕获错误并对其进行处理(或者让它传播我想......)或者您可以为 next:
value_gen = (key2 for key2 in LUT_value.keys() if LUT_value[key2] == self.value)
some_default = 'Default Yeah!'
b = next(value_gen, some_default)
如果您需要先找到这样的匹配值,使用next()
function and a generator expression:
b = next((key2 for key2, value in LUT_value.items() if value == self.value), '')
这会生成您的第一个 key2
符合条件的值,如果没有这样的值,则生成一个空字符串。我使用 dict.items()
而不是循环 dict.keys()
,然后查找各个值。此外,遍历 dict.keys()
是多余的;如果您只想遍历键,只需直接遍历 dict
对象即可。
我想知道你是否应该存储一个 inverse 映射:
inverse_LUT_values = {value: key for key, value in LUT_value.items()}
然后只需使用:
b = inverse_LUT_values.get(self.value, '')
甚至
b = inverse_LUT_values[self.value]
与 inverse_LUT_values
存储以供重复使用。如果有多个具有相同值的键可以匹配,对您来说似乎无关紧要,因此反向映射只保留一个这样的键。