[英]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方式吗?
如果要使ll
中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}
首先从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.