我在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方式
答案 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(正如你在你的问题中所提到的那样)。