python中的列表匹配:获取较大列表中子列表的索引
Posted
技术标签:
【中文标题】python中的列表匹配:获取较大列表中子列表的索引【英文标题】:list match in python: get indices of a sub-list in a larger list 【发布时间】:2012-05-10 06:26:48 【问题描述】:对于两个列表,
a = [1, 2, 9, 3, 8, ...] (no duplicate values in a, but a is very big)
b = [1, 9, 1,...] (set(b) is a subset of set(a), 1<<len(b)<<len(a))
indices = get_indices_of_a(a, b)
如何让get_indices_of_a
用array(a)[indices] = b
返回indices = [0, 2, 0,...]
?有没有比a.index
更快的方法,耗时太长?
将b
设为一个集合是匹配列表和返回索引的快速方法(参见compare two lists in python and return indices of matched values),但在这种情况下它将丢失第二个1
的索引以及索引的序列。
【问题讨论】:
【参考方案1】:一种快速方法(当a
是一个大列表时)是使用字典将a
中的值映射到索引:
>>> index_dict = dict((value, idx) for idx,value in enumerate(a))
>>> [index_dict[x] for x in b]
[0, 2, 0]
在平均情况下,这将花费线性时间,而使用 a.index
将花费二次时间。
【讨论】:
+1。对于大型列表来说,这是一个很好的答案,它将大大减少所需的时间 - 自然地,在小型列表上,字典的创建将花费更多的时间而不是节省的时间。鉴于提问者对我的回答的评论,似乎涉及到大名单,所以这是想要的答案。【参考方案2】:假设我们正在处理较小的列表,这很简单:
>>> a = [1, 2, 9, 3, 8]
>>> b = [1, 9, 1]
>>> [a.index(item) for item in b]
[0, 2, 0]
在较大的列表中,这将变得非常昂贵。
(如果有重复,第一个出现的总是结果列表中引用的那个,如果not set(b) <= set(a)
,你会得到一个ValueError)。
【讨论】:
非常感谢!没有重复,但是 a 很大,b 也不小,虽然 len(b) @user1342516 是的,请参阅interjay's answer。 您可以将其添加到您的解决方案中以消除 ValueError 情况:[a.index(item) for item in b if item in a] @AshwiniChaudhary 鉴于提问者所说的,我认为他更喜欢错误而不是无声的失败。当然,如果您想跳过缺少的元素,那么可以。以上是关于python中的列表匹配:获取较大列表中子列表的索引的主要内容,如果未能解决你的问题,请参考以下文章