繁体   English   中英

Golang相当于Python的列表理解

[英]Golang equivalent for Python's list comprehension

我正在玩Go,但我很难做其他语言非常简单的事情。

我想重现一个类似的语法:

array = [a for a in anotherArray  if (some condition)]

Go的优雅方式是什么? 我真的很想简化我的代码,尤其是在使用数组上的函数时。 例如:

min = min(abs(a[i], b[j]) for i in range(n)
                          for j in range(i, n))

非常感谢

有趣的是, Rob Pike刚刚提出(18小时前)库过滤器 ,它可以满足您的需求:

参见例如选择()

// Choose takes a slice of type []T and a function of type func(T) bool. (If
// the input conditions are not satisfied, Choose panics.) It returns a newly
// allocated slice containing only those elements of the input slice that
// satisfy the function.

在这里测试

func TestChoose(t *testing.T) {
    a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    expect := []int{2, 4, 6, 8}
    result := Choose(a, isEven)

正如twotwotwo 在评论中指出的那样,该库GoDoc指出:

filter包含实用程序功能,用于通过过滤功能的分布式应用程序过滤切片。

该软件包是一个实验,看看在Go中编写这样的东西是多么容易。 这很容易,但是for循环来说同样简单且高效

你不应该使用这个包。

这个警告反映在文档“ Go Generics Discussions ”中,“ 功能代码 ”部分:

这些是通常的高阶函数 ,如mapreducefold ), filterzip等。

案例
类型安全数据转换: mapfoldzip

使用泛型的优点
表达数据转换的简洁方法。

使用泛型的缺点
最快的解决方案需要考虑应用这些转换的时间和顺序,以及每个步骤生成的数据量。
初学者更难阅读。

替代方案

for循环和通常的语言结构

如果您正在寻找的确是python列表理解,那么在AFAIK中就没有这样的语法等价物。

这样做的方法是创建一个函数,该函数采用切片和函数(以测试条件)并返回一个新切片。

编辑:看起来Go中已经有这样的功能了。 cf VonC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM