2

オブジェクトのリストと、関連するパラメータのリスト (param1、param2、param3 など) がある状況に陥ることがよくあります。いくつかの条件を満たすパラメータを持つオブジェクトのサブセットを取得したいと考えています。疑似コードは次のようになります。

subset = object if param1>10 and 5<param2-param3<6 and param4==1

リスト内包表記を使用してそれを行う方法は知っていますが、非常に見苦しく、他の人が読みにくい場合があります。代替手段はありますか?たとえば、リストの要素を 2 つずつ追加するには、次のような手間がかかります。

list1=[1,2,3,4]
list2=[10,10,10,10]

[item[0]+item[1] for item in zip(list1,list2)]
>>> [11, 12, 13, 14]

リスト内包表記の代わりに NumPy 配列を使用すると、すぐに明確に見えます。

import numpy
list1=numpy.array([1,2,3,4])
list2=numpy.array([10,10,10,10])

list1 + list2
>>> array([11, 12, 13, 14])

そして、2 つ以上のリストに対していくつかの重要な操作を開始すると、明確さの向上はさらに大きくなります。

オブジェクトのリストでいくつかの行のみを選択するという最初の問題に戻ります。

subset = [item[0] for item in zip(object,param1,param2,param3,param4) if item[1]>10 and item[2]-item[3]>5 and item[2]-item[3]<6 and item[4]==1]

また:

subset = [obj for obj,p1,p2,p3,p4 in zip(object,param1,param2,param3,param4) if p1>10 and p2-p3>5 and p2-p3<6 and p4==1]

私が望むものを正確に実行しますが、それは非常にエレガントではありません。言うまでもなく、非 Pythoneers はすぐに「SuperMongo の方が簡単です」または「これのために IDL をあきらめてほしい!?」と言い始めます。

この特定のタスクに適した構文を提供する代替ソリューションを知っていますか? NumPy 配列は、構文を単純化するのに役立ちますか?

4

4 に答える 4

2

適切にインデントすれば、2番目の例はかなり読みやすくなると思います。

[obj for obj, p1, p2, p3, p4 in zip(object, param1, param2, param3, param4) 
 if p1 > 10 
 and p2 - p3 > 5
 and p2 - p3 < 6
 and p4 == 1]
于 2013-02-27T14:08:59.640 に答える
0

filterforループを使用するか、単に使用することができます。

于 2013-02-27T14:08:05.117 に答える
0

Numpy 配列バージョン:

subset = objects[(param1>10) & (param2-param3>5) & (param2-param3<6) & (param4==1)]

ただし、[] 内のすべての操作は一時的な配列を作成します。配列のサイズが大きい場合は、最適化が必要になる場合があります。

于 2013-02-27T14:23:17.317 に答える
0

map/imapと組み合わせて使用​​できますcompress

from itertools import imap, compress

compress(obj_list, imap(lambda p1, p2, p3, p4: p1 > 10 and 5 < p2 - p3 < 6 and p4 == 1, param1_list, param2_list, param3_list, param4_list))

また、関数にカプセル化して、わずかにクリーンなインターフェイスを提供することもできます。

mask_filter(filter_function, data, masks):

    return compress(data, imap(filter_function, masks))

mask_validator = lambda *params: params[0] > 10 and 5 < params[1] - params[2] < 6 and params[3] == 1
parameter_lists = (param1_list, param2_list, param3_list, param4_list)
mask_filter(mask_validator, obj_list, *parameter_lists)
于 2013-02-27T14:27:08.267 に答える