使用两个值替换列表中的None

enn*_*ppi 0 python list-comprehension list

我想None01取决于一些外部条件来取代价值.我的解决方案是:

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"等:在这种情况下,这样我写上面的代码是可接受的文体?

Mar*_*ers 5

由于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)


Kas*_*mvd 5

如果您有很多选项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(默认情况下)的方法,如果字典中不存在该键,或者您可以传递自定义值以便在缺少键时传递.