在 Go 列表中按值删除元素
Remove element by value in Go list
我有一个元素列表,我想按值删除其中一个。在 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
结构,但它不是通用的,因此需要大量类型转换才能使用。
从列表中删除元素的惯用方法是什么?
从列表中删除元素的惯用方法是完全像您在示例中那样循环遍历它。从切片中按值删除元素在您的程序中不应该太常见,因为它是一个 O(n)
操作,并且语言中有更好的数据结构。因此,Go 没有为切片提供内置的 remove 函数。
如果您发现自己经常使用按值删除,请考虑改用集合,其中删除和添加元素 O(1)
同时仍可迭代。
set := map[string]bool{"apples":true, "oranges":true, "melon":true}
delete(set,"melon") // is O(1)
在通用 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
}
我有一个元素列表,我想按值删除其中一个。在 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
结构,但它不是通用的,因此需要大量类型转换才能使用。
从列表中删除元素的惯用方法是什么?
从列表中删除元素的惯用方法是完全像您在示例中那样循环遍历它。从切片中按值删除元素在您的程序中不应该太常见,因为它是一个 O(n)
操作,并且语言中有更好的数据结构。因此,Go 没有为切片提供内置的 remove 函数。
如果您发现自己经常使用按值删除,请考虑改用集合,其中删除和添加元素 O(1)
同时仍可迭代。
set := map[string]bool{"apples":true, "oranges":true, "melon":true}
delete(set,"melon") // is O(1)
在通用 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
}