【问题标题】:Equivalent for Python's list comprehension等效于 Python 的列表推导
【发布时间】:2015-01-08 19:51:22
【问题描述】:

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

我想复制一个Python comprehension

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))

【问题讨论】:

  • 第二个例子在 python 中不起作用:abs 需要 1 个参数,而不是 2 个。

标签: python go


【解决方案1】:

有趣的是,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”部分:

这些是通常的higher-order functions,例如mapreduce (fold)、filterzip 等。

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

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

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

替代解决方案

使用for 循环和常用语言结构


2022 年第一季度更新:在 Go 中首次集成泛型(参见例如“Tutorial: Getting started with generics”),您现在有一个可能的mapreduce implementation with generics in Go
请参阅 tip.playgroundgithub.com/kevwan/mapreduce/v2 项目。

【讨论】:

  • 我倾向于同意 Pike 的自述文件——使用 for。可能永远,但肯定是现在,Go 是一种支持直线代码的命令式语言。不管有多少人希望它改变,语言可能不会改变以使其他方法更容易,或多或少。该软件包的重点是(在收到投诉后),如果您觉得自己真的需要 reflect 之类的东西,那么您可以做那种事情,而不是他认为您应该这样做。
  • @twotwotwo 是的,我想'for',加上一些'go generate' 就足够了。
  • 请注意突出的“你不应该使用这个包”。在godoc.org/robpike.io/filter
【解决方案2】:

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

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

编辑: 看起来 Go 中已经有了这样的功能。参考冯克

【讨论】:

  • Not in Go(只是 GitHub 上的一个普通库),文档建议你不要使用它;这只是一个实验,表明如果你愿意,你可以做到。
猜你喜欢
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 2016-05-15
  • 2010-11-07
相关资源
最近更新 更多