0

ここに新しいタスクがあります: 配列からデータを選択する際に次の問題があります

a = [1100, 1140, 1258, 1800, 2100, 2365]

この arry から、厳密に 2000 未満の値と厳密に 2000 を超える値を選択したいと思います...この場合は 1800 と 2100 です

どんな助けでもいただければ幸いです

4

4 に答える 4

2

NumPy を使用していた場合:

a[a>2000].min()
a[a<2000].max()

NumPy 配列は、ブール値の配列によってインデックス付けできます。指定された条件 (ここでは、2000 より上か下か) を満たす要素のみを選択すると、出力自体が NumPy 配列 (と呼ばれるndarray) になります [実際には、返されるのは、初期配列のサブセットであり、同じ要素です]。であるため、そのおよびメソッドndarrayを使用できます。minmax

構文が非常に読みやすいことは認めるでしょう。

しかし、numpy なしで立ち往生している場合は、いつでも次のようなものを試すことができます

min(i for i in a if i>2000)
max(i for i in a if i<2000)
于 2012-09-06T16:14:06.863 に答える
2

それはあなたが必要とするものですか?

>>> a = [1100, 1140, 1258, 1800, 2100, 2365]
>>> max(x for x in a if x < 2000)
1800
>>> min(x for x in a if x > 2000)
2100

確かに、より多くの (そしておそらくより良い) ソリューションがあります。

上記のソリューションでは、いわゆるジェネレータ式(Python 2.4 で導入) を使用しています。つまり、このアプローチでは新しいリスト オブジェクトは作成されません。a2回繰り返すだけです。他の人が指摘したように、a既にソートされている場合は、これを 1 回の繰り返しに減らすことができます。

更新(上記のコメントによる):

>>> from itertools import izip
>>> a = [1100, 1140, 1258, 1800, 2100, 2365]
>>> b = ['r', 's', 't', 'u', 'v', 'w']
>>> max((a,b) for a,b in izip(a,b) if a < 2000)
(1800, 'u')
>>> min((a,b) for a,b in izip(a,b) if a > 2000)
(2100, 'v')

このアプローチは、2タプルのリストで極値を検索します[(1100, 'r'), (1140, 's'), ...]。これは、極値を検索するために、リストの値が等しい場合、bリストの値が考慮されることを意味します。この回答を参照してください。a

お知らせ: 最初のアプローチとまったく同じ動作を得るために、つまり、実際aには極値検索中にのみ値を評価するために、次を使用できます。

from operator import itemgetter
from itertools import izip
min(((a,b) for a,b in izip(a,b) if a > 2000)), key=itemgetter(0))

これは、アイテム 0、つまり 2 タプルの最初のアイテム、つまりa最小値を検索するためのリストの値を使用します。

于 2012-09-06T16:00:16.517 に答える
1

あなたが本当に2000未満の最高値と2000以上の最低値を意味するなら、あなたはそれらを経由して得ることができます

In [3]: max([x for x in a if x < 2000])
Out[3]: 1800


In [4]: min([x for x in a if x > 2000])
Out[4]: 2100

これはどのように作動しますか?リスト内包[x for x in a if x < 2000]表記は、2000未満の要素をすべて選択します。次に、最大のものを探します。

リストがすでに並べ替えられていることがわかっている場合は、おそらくもっと効率的な方法があります。

于 2012-09-06T16:02:55.983 に答える
0

配列を並べ替えて、2000 より大きい最初の値を見つけたら、その値と前の値を取得します。

于 2012-09-06T16:00:16.377 に答える