繁体   English   中英

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

[英]Find last occurrence of any item of one list in another list in python

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

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给出了总长度。

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

如果要使llll中每个项目的所有 最后索引都以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}

首先从mm创建一个set以使其成为O(1)而不是O(N),这可能是值得的,但是对于三项而言,这确实不值得。

遵循@Apero关于将丢失的索引保留为None的担忧,并使用哈希查找使其成为O(1)查找...

# Build a key->None dict for all `mm`
d = dict.fromkeys(mm)
# Update `None` values with last index using a gen-exp instead of dict-comp
d.update((v,k) for k,v in enumerate(ll) if v in d)
# {499: None, 501: 3, 502: 5}
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}

您可以使用列表推导和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]

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

综上所述,我认为它比编写函数和使用列表理解(如您在问题中提到的)更像是Python。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM