如何将None添加到没有相应值的列表中?

时间:2016-07-01 19:00:21

标签: python list tuples nonetype

对于' b'中的每个元素我需要从' a'中找到它的价值。并将其放到结果列表中。如果没有相应的值存储在' a'我需要把无

示例:

getValues([("key1", "value1"), ("key2", "value2"), ("key3", "value3")], ["key2","key3","key3","key4","key1","key5"])

必须返回["value2", "value3", "value3", None, "value1", None]

如何修复代码,以便将其添加到必须的列表中?

def getValues(a, b):
    result = []
    for i in range(len(b)):
            for n in range(len(a)):
                    if b[i] == a[n][0]:
                            result.append(a[n][1])
    return result

无论我在哪里尝试添加无条件,它都无法正常工作。

2 个答案:

答案 0 :(得分:2)

>>> [dict(a).get(el) for el in b]
['value2', 'value3', 'value3', None, 'value1', None]

答案 1 :(得分:2)

从您的代码开始,您需要做的是确定您是否在a中找到了某些内容。找到匹配后,您可以从内部for循环break。这样,您可以使用for..else语法来确定您需要使用None

def getValues(a, b):
    result = []
    for i in range(len(b)):
        for n in range(len(a)):
            if b[i] == a[n][0]:
                result.append(a[n][1])
                break
        else:
            result.append(None)
    return result

但是,a中每个项目的b循环都很昂贵。由于a本质上是一个查找,因此您应该考虑将其转换为字典。由于a是键/值元组的列表,因此非常简单;你只需要拨打dict(a)

之后,你可以删除内循环:

def getValues(a, b):
    result = []
    d = dict(a)
    for i in range(len(b)):
        if b[i] in d:
            result.append(d[b[i]])
        else:
            result.append(None)
    return result

除了检查项目是否在字典中之外,您还可以使用dict.get()代替,如果密钥不在字典中,它将返回默认值。默认情况下,这是None(方便),所以你可以这样做:

def getValues(a, b):
    result = []
    d = dict(a)
    for i in range(len(b)):
        result.append(d.get(b[i]))
    return result

最后,不应迭代索引,而应迭代b的列表项:

def getValues(a, b):
    result = []
    d = dict(a)
    for x in b:
        result.append(d.get(x))
    return result

由于您为b中的每个项目附加了一个项目,您还可以通过一个很好的列表理解来替换它:

def getValues(a, b):
    d = dict(a)
    return [d.get(x) for x in b]