28

C#では、LINQを使用して、列挙型がある場合enumerable、次のことができます。

// a: Does the enumerable contain an item that satisfies the lambda?
bool contains = enumerable.Any(lambda);

// b: How many items satisfy the lambda?
int count = enumerable.Count(lambda);

// c: Return an enumerable that contains only distinct elements according to my custom comparer
var distinct = enumerable.Distinct(comparer);

// d: Return the first element that satisfies the lambda, or throws an exception if none
var element = enumerable.First(lambda);

// e: Returns an enumerable containing all the elements except those
// that are also in 'other', equality being defined by my comparer
var except = enumerable.Except(other, comparer);

PythonはC#よりも簡潔な構文を持っている(したがって生産性が高い)と聞いていますが、Pythonで反復可能で、同じ量以下のコードで同じことを実現するにはどうすればよいですか?

注:(、、)を実行する必要がない場合は、反復可能オブジェクトをリストに具体化する必要はありAnyませCountFirst

4

3 に答える 3

16

次のPython行は、あなたが持っているものと同等である必要があります(funcまたはlambda、コード内でブール値を返すと仮定します)。

# Any
contains = any(func(x) for x in enumerable)

# Count
count = sum(func(x) for x in enumerable)

# Distinct: since we are using a custom comparer here, we need a loop to keep 
# track of what has been seen already
distinct = []
seen = set()
for x in enumerable:
    comp = comparer(x)
    if not comp in seen:
        seen.add(comp)
        distinct.append(x)

# First
element = next(iter(enumerable))

# Except
except_ = [x for x in enumerable if not comparer(x) in other]

参照:

Pythonのキーワードであるsinceに名前を変更lambdaしたことに注意してください。同じ理由で、に名前を変更しました。funclambdaexceptexcept_

map()内包表記/ジェネレータの代わりに使用することもできますが、一般的に読みにくいと考えられていることに注意してください。

于 2012-08-20T17:19:49.517 に答える
12

元々の質問は、Pythonのiterablesで同じ機能を実現する方法でした。リスト内包表記を楽しんでいる限り、多くの状況でLINQの方が読みやすく、直感的で簡潔であることがわかります。次のライブラリは、Pythonの反復可能オブジェクトをラップして、同じLINQセマンティクスを使用してPythonで同じ機能を実現します。

組み込みのPython機能を使い続けたい場合は、このブログ投稿で、C#LINQ機能から組み込みのPythonコマンドへのかなり完全なマッピングを提供します。

于 2020-01-17T22:13:45.827 に答える
6

ジェネレータ式と、イテラブル上で任意の条件を表現するためのさまざまな関数があります。

any(some_function(e) for e in iterable)
sum(1 for e in iterable if some_function(e))
set(iterable)
next(iterable)
(e for e in iterable if not comparer(e) in other)

慣用的なPythonで例を書く方法にほぼ対応します。

于 2012-08-20T17:20:07.893 に答える