web-dev-qa-db-ja.com

Pythonのリスト内包表記に相当

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

どうもありがとう

24
Spearfisher

興味深いことに、 Rob Pike 提案されたばかり(18時間前)ライブラリ filter は、あなたが望むことを少し実行します。

参照 たとえば、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.

ここでテスト済み

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ループも同じくらい簡単で効率的です

このパッケージは使用しないでください。

この警告は、ドキュメント " Summary of Go Generics Discussions "、セクション " 機能コード ":

これらは、mapreducefold)、filterZipなど.

ケース
タイプセーフなデータ変換:mapfoldZip

ジェネリックを使用することの利点
データ変換を表現する簡潔な方法。

ジェネリックを使用する場合の短所
最速のソリューションでは、これらの変換を適用するタイミングと順序、および各ステップで生成されるデータの量を考慮する必要があります。
初心者には読みにくいです。

代替ソリューション

forループと通常の言語構成体を使用します

11
VonC

あなたが探しているものが本当にpythonリスト内包表記である場合、go AFAIKにはそのような構文上の同等のものはありません。

それを行う方法は、スライスと関数(条件をテストするため)を取得する関数を作成し、新しいスライスを返すことです。

編集:Goにはすでにそのような機能があるようです。 cf VonC

2