【问题标题】:How to traverse through list and remove via index in Python?如何遍历列表并通过Python中的索引删除?
【发布时间】:2015-04-29 11:40:10
【问题描述】:

我正在导入 CSV 文件并搜索每个元素以匹配正则表达式。如果为真,我想删除该元素。但是我想通过索引而不是值来删除元素,特别是因为通过索引删除更快。

with open(file, "r", newline="") as fh:
    data = csv.reader(fh)
    s_data = sorted(data, key=operator.itemgetter(0))

    regex = re.compile("\D")

    # Search for any non-numeric characters in each index and discard the element, if found.
    for element in s_data:
        if regex.search(element[0]) is not None:
            pop(element) # <-- this is the problem

如何通过索引删除匹配的元素?

【问题讨论】:

    标签: python list search stack


    【解决方案1】:
    s_data = [e for e in s_data if regex.search(e[0]) is None]
    

    在效率方面更好。

    从您的代码中,我可以告诉您要使用此标准保留元素:

    regex.search(e[0]) is None
    

    如果你一个一个地删除元素,因为从列表中删除是O(n),如果你多次删除,对于大数据来说确实不会很快。

    我提供的称为列表理解。这是一种生成列表的python方式。它创建一个新列表,而不是从原始列表中删除元素。列表推导更有可能以 c 级效率进行优化和执行。

    在函数式风格上类似,但速度稍慢:

    s_data = filter(lambda e: regex.search(e[0]) is None, s_data)
    

    【讨论】:

    • 非常迷人的东西。我是 Python 新手,但对其他一些语言不熟悉。它看起来类似于人们可能在 Perl 中看到或使用的一些速记代码。我很欣赏这个教训。谢谢。
    • 这实际上是一个列表推导,而不是一个生成器
    【解决方案2】:
    s_data.pop(s_data.index(element))
    

    如果s_data 中的每个元素都是唯一的,则将起作用。如果没有,你可以这样做

    for index, element in enumerate(s_data):
            if regex.search(element[0]) is not None:
                s_data.pop(index)
    

    【讨论】:

    • 对于唯一的值,第二种方法是 OP 正在寻找的。 s_data.index(element) 是一个 O(n) 线性搜索来查找该值的索引,此时您不妨按值删除。
    • 谢谢!是的,两者都是不错的选择,虽然我猜第二个更快,即使元素是独一无二的,是吗?
    • @user3621633 如果您需要删除大量元素,这两种方法都不能被认为是快速的。如果你这样做 pythonic 会更快:s_data = [e for e in s_data if regex.search(e[0]) is None].
    • @HuStmpHrrr 也许你可以写出答案来解释这段代码的作用。我不明白那行代码将如何删除元素。谢谢。
    • @user3621633 它被称为list comprehension。本质上,他们通过在一些可迭代的输入上执行map 和filter 来创建一个新列表。 Python 非常有效地实现了这一点,并且比删除 for 循环快得多,因为从列表中删除是 O(n) 而for 是 in general quite slow。
    猜你喜欢
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多