在python中查找另一个列表中一个列表的任何项的最后一次出现

时间:2014-10-08 21:09:03

标签: python list

我在python中有以下两个列表:

ll = [500,500,500,501,500,502,500]
mm = [499,501,502]

我想在列表ll中找出mm中任何项目的最后一次出现的位置。我可以为这样的单个元素执行此操作:

len(ll) - 1 - ll[::-1].index(502)
>> 5

这里ll [:: - 1] .index(502)提供502的最后出现位置,len(ll) - 1给出总长度。

如何将其扩展为整个列表?我知道我可以写一个函数,但有更多的pythonic方式

3 个答案:

答案 0 :(得分:4)

如果您想要所有 <{1}}中ll中每个项目的最后索引,那么:

mm

首先从ll = [500,500,500,501,500,502,500] mm = [499,501,502] d = {v:k for k,v in enumerate(ll) if v in mm} # {501: 3, 502: 5} 创建一个set以使其成为O(1)查找而不是O(N),但是对于三个项目,它实际上是不值得的。

关注@ Apero担心将缺失的索引保留为mm,并使用哈希查找使其成为None查找...

O(1)

答案 1 :(得分:1)

results = {}
reversed = ll[::-1]

for item in mm:
    try:
        index = ((len(ll) - 1) - reversed.index(item))
    except ValueError:
        index = None
    finally:
        results[item] = index

print results

输出:

{499: None, 501: 3, 502: 5}

答案 2 :(得分:0)

您可以使用列表推导和max功能执行此操作。特别是,对于ll中的每个元素,迭代mm以创建ll[i] = mm[i]的索引列表,并获取此列表的max

>>> indices = [ max([-1] + [i for i, m in enumerate(mm) if m == n])  for n in ll ]
>>> indices
[-1, -1, -1, 1, -1, 2, -1]

请注意,如果[-1]中没有匹配的索引,则需要添加mm

所有这一切,我不认为它比编写函数和使用列表理解更具有Python-ic(正如你在你的问题中所提到的那样)。