【问题标题】:Python: Use list.index with regular expressionPython:使用带有正则表达式的 list.index
【发布时间】:2013-11-04 15:51:02
【问题描述】:

我有一个字符串列表,我想从中提取某个值:

["bla","blabla","blablabla","time taken to build model: 5.1 seconds", "blabla"]

通常我会通过

查找我要查找的元素的索引
list.index("time taken")

但由于时间变化,我想到了使用正则表达式。我只是不知道该怎么做。

那么我怎样才能找出与某个正则表达式匹配的列表元素的索引,例如重新匹配()? (如果不遍历列表,这将花费很长时间)

【问题讨论】:

  • 你真的认为没有迭代就可以逃脱吗?甚至 list.index 也是一个迭代。如果您需要这么高的性能,请使用具有已知键的字典,而不是通过列表进行搜索。
  • 列表中是否有多个项目包含“花费时间”?如果是这样,您是否尝试根据 时间 查找特定项目。是否需要保留列表中项目的索引?
  • 好吧,如果操作不需要几分钟,但如果没有其他方法我也可以迭代,那会更好。但是用字典的想法很好。我对 python 的了解并不深,知道 list.index 也在迭代。实际上,我问了这个问题,以学习未来的任务并学习优雅的编码。
  • @evuez - 原则上你是对的。如果没有迭代就没有其他方法可以做到这一点,那么它是重复的。很抱歉,我在搜索答案时没有找到它。

标签: python regex list search indexing


【解决方案1】:

如果您的首要任务是获得序列中的第一个匹配项,那么只有 index() 有用。 如果你想在index() 方法中使用正则表达式,你就是这样做的

lst=["bla","blabla","blablabla","time taken to build model: 5.1 seconds", "blabla"]

lst.index([i for i in lst if re.findall(r'^time taken', i)][0])

【讨论】:

    【解决方案2】:

    不确定是否有内置方法,但在O(n) 时间使用列表推导很容易做到这一点。

    使用正则表达式:

    import re
    your_list = ["bla","blabla","blablabla","time taken to build model: 5.1 seconds", "blabla"]
    regex = re.compile("^time taken")
    idxs = [i for i, item in enumerate(your_list) if re.search(regex, item)]
    

    并且没有正则表达式:

    your_list = ["bla","blabla","blablabla","time taken to build model: 5.1 seconds", "blabla"]
    query_term = 'time taken'
    idxs = [i for i, item in enumerate(your_list) if item.startswith(query_term)]
    

    您可以使其返回第一个找到的索引或最后一个找到的索引,具体取决于或在方法中对其进行参数化以提供灵活性。

    【讨论】:

      【解决方案3】:

      正则表达式解决方案需要遍历序列。如果你想得到带有一些前缀或后缀的字符串,你应该实现Trie,这是解决问题的最快方法。您也可以使用不同长度的循环哈希来实现解决方案,但在某些情况下它会效率不高。

      【讨论】:

        【解决方案4】:

        要在列表中查找元素,除非您有额外的信息(例如元素的顺序),否则您必须遍历它。 如果您真的想更快,请更改结构、使用数据库或使用另一种语言。

        【讨论】:

        • 感谢您提供的信息。因此,由于之前似乎有人问过这个问题,如果没有其他建议出现,我将删除我的问题。
        猜你喜欢
        • 1970-01-01
        • 2015-07-22
        • 2012-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-19
        • 2010-09-28
        相关资源
        最近更新 更多