enn*_*ppi 0 python list-comprehension list
我想None用0或1取决于一些外部条件来取代价值.我的解决方案是:
my_list = [3, 4, 5, None, 6, 7, None, 8, None]
my_list = [(1 if external_string == "ONE" else 0) if v is None else v for v in my_list]
Run Code Online (Sandbox Code Playgroud)
这是解决问题的pythonic方法吗?让我们假设有字符串的两个以上的可能值,以便分配,例如,0,如果external_string是"ZERO",1,如果external_string如果"ONE",2如果external_string是"TWO"等:在这种情况下,这样我写上面的代码是可接受的文体?
由于external_string循环中没有变化,因此您可以计算一次替换值:
replacement = 1 if external_string == 'ONE' else 0
my_list = [replacement if v is None else v for v in my_list]
Run Code Online (Sandbox Code Playgroud)
如果external_string测试使用的数据更改或更复杂,只需创建一个函数:
def replace(value):
if value is not None:
return value
return 1 if external_string == 'ONE' else 0
my_list = [replace(v) for v in my_list]
Run Code Online (Sandbox Code Playgroud)
不要试图把所有东西塞进列表理解中; 可读性很重要!
对于多个选项,请考虑使用将外部字符串映射到替换值的字典:
external_string_map = {'ONE': 1, 'TWO': 2} # etc.
replacement = external_string_map.get(external_string, 0)
my_list = [replacement if v is None else v for v in my_list]
Run Code Online (Sandbox Code Playgroud)
如果您有很多选项external_string可以更好地使用保留所有可能性的字典,那么请使用external_string以下方法选择正确的替换值:
all_options = {'ZERO':0, 'ONE':1, 'TWO':2, 'THREE': 3}
my_list = [all_options[external_string] if v is None else v for v in my_list]
Run Code Online (Sandbox Code Playgroud)
请注意,除了使用直接索引之外,您还可以使用dict.get()将返回None(默认情况下)的方法,如果字典中不存在该键,或者您可以传递自定义值以便在缺少键时传递.