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

时间:2016-12-26 17:25:40

标签: python list list-comprehension

我希望将None值替换为01,具体取决于某些外部条件。我的解决方案是:

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]

这是解决问题的pythonic方法吗?假设有两个以上可能的字符串值以便分配,例如,如果external_string"ZERO",则为0;如果是external_string则为"ONE",如果为external_string,则为2 {1}}是"TWO",依此类推:在这种情况下,我编写上述代码的方式在风格上是可以接受的?

2 个答案:

答案 0 :(得分: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]

如果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]

不要试图把所有东西塞进列表理解中;可读性很重要!

对于多个选项,请考虑使用将外部字符串映射到替换值的字典:

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]

答案 1 :(得分: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]

请注意,除了使用直接索引之外,您还可以使用dict.get()方法,如果密钥不存在于字典中,您将返回None(默认情况下),或者您可以按顺序传递自定义值在没有钥匙的情况下通过。