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_aarray(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) &lt;= 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中的列表匹配:获取较大列表中子列表的索引的主要内容,如果未能解决你的问题,请参考以下文章

获取分层表中子级列表的根元素

如何比较python中的两个列表并返回匹配项

php 在父页面上获取缩略图和列表中子页面标题的短代码

比较python中的两个列表并返回匹配值的索引

python入门教程NO.3 用python破解谍报密码

Python:使用列表和数据框精确匹配单词