【问题标题】:list match in python: get indices of a sub-list in a larger listpython中的列表匹配:获取较大列表中子列表的索引
【发布时间】: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 的索引以及索引的序列。

【问题讨论】:

    标签: python list set match indices


    【解决方案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 鉴于提问者所说的,我认为他更喜欢错误而不是无声的失败。当然,如果您想跳过缺少的元素,那么可以。
    猜你喜欢
    • 2015-07-03
    • 2019-02-13
    • 1970-01-01
    • 2011-03-10
    • 2013-03-30
    • 2013-03-28
    • 2015-01-28
    • 1970-01-01
    • 2015-11-10
    相关资源
    最近更新 更多