Golang相当于Python的列表理解

时间:2015-01-08 19:51:23

标签: python go

我正在玩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))

非常感谢

2 个答案:

答案 0 :(得分:10)

有趣的是,Rob Pike刚刚提出(18小时前)图书馆filter,它有点像你想要的那样:

请参阅for instance Choose()

// 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.

Tested here

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指出in the commentsGoDoc for this library州:

  

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

     

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

     

您不应该使用此软件包。

此警告反映在文档" Summary of Go Generics Discussions"," Functional Code":

  

通常为map,例如reducefoldfilter),zipmap等。

     

<强>例
  类型安全数据转换:foldzipfor

     

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

     

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

     

替代解决方案

     

使用{{1}}循环和通常的语言结构

答案 1 :(得分:1)

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

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

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