【问题标题】:Remove element by value in Go list在 Go 列表中按值删除元素
【发布时间】:2015-09-13 19:51:01
【问题描述】:

我有一个元素列表,我想按值删除其中一个。在 Python 中,这将是

l = ["apples", "oranges", "melon"]
l.remove("melon")
print(l) # ["apples", "orange"]

Go 中的等价物是什么?我找到了 slice trick 来按索引删除元素,但它的可读性不是很高,仍然需要我手动查找索引并且仅适用于单个项目类型:

func remove(l []string, item string) {
    for i, other := range l {
        if other == item {
            return append(l[:i], l[i+1:]...)
        }
    }
}

list.List 结构,但它不是通用的,因此需要大量的类型转换才能使用。

从列表中删除元素的惯用方法是什么?

【问题讨论】:

  • 让我澄清一下,您需要从切片或容器列表中删除一个项目?
  • 我目前有一个切片,但我愿意将其替换为容器列表或其他任何可以完成工作的内容。

标签: list go slice


【解决方案1】:

从列表中删除元素的惯用方法是像您在示例中所做的那样循环遍历它。从切片中按值删除元素在您的程序中不应该太常见,因为它是一个O(n) 操作,并且该语言中有更好的数据结构。因此,Go 没有提供内置的切片删除功能。

如果您发现自己经常使用按值删除,请考虑使用集合代替,其中删除和添加元素是 O(1),同时仍可迭代。

set := map[string]bool{"apples":true, "oranges":true, "melon":true}
delete(set,"melon") // is O(1)

【讨论】:

  • 我认为使用基于集合的方法并不总是合适的,因为集合通常是无序的。因此,当任务是:“从已排序的数据集合中按值删除元素”时,set 将无济于事。
【解决方案2】:

在通用 Go (1.18) 中,过滤器功能适用于任何 comparable 类型

func remove[T comparable](l []T, item T) []T {
    for i, other := range l {
        if other == item {
            return append(l[:i], l[i+1:]...)
        }
    }
    return l
}

在这里试试https://go.dev/play/p/ojlYkvf5dQG?v=gotip

【讨论】:

    猜你喜欢
    • 2020-09-27
    • 2020-03-14
    • 2017-12-16
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2018-07-06
    相关资源
    最近更新 更多