簡體   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