ここに新しいタスクがあります: 配列からデータを選択する際に次の問題があります
a = [1100, 1140, 1258, 1800, 2100, 2365]
この arry から、厳密に 2000 未満の値と厳密に 2000 を超える値を選択したいと思います...この場合は 1800 と 2100 です
どんな助けでもいただければ幸いです
ここに新しいタスクがあります: 配列からデータを選択する際に次の問題があります
a = [1100, 1140, 1258, 1800, 2100, 2365]
この arry から、厳密に 2000 未満の値と厳密に 2000 を超える値を選択したいと思います...この場合は 1800 と 2100 です
どんな助けでもいただければ幸いです
NumPy を使用していた場合:
a[a>2000].min()
a[a<2000].max()
NumPy 配列は、ブール値の配列によってインデックス付けできます。指定された条件 (ここでは、2000 より上か下か) を満たす要素のみを選択すると、出力自体が NumPy 配列 (と呼ばれるndarray
) になります [実際には、返されるのは、初期配列のサブセットであり、同じ要素です]。であるため、そのおよびメソッドndarray
を使用できます。min
max
構文が非常に読みやすいことは認めるでしょう。
しかし、numpy なしで立ち往生している場合は、いつでも次のようなものを試すことができます
min(i for i in a if i>2000)
max(i for i in a if i<2000)
それはあなたが必要とするものですか?
>>> 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 で導入) を使用しています。つまり、このアプローチでは新しいリスト オブジェクトは作成されません。a
2回繰り返すだけです。他の人が指摘したように、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
最小値を検索するためのリストの値を使用します。
あなたが本当に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未満の要素をすべて選択します。次に、最大のものを探します。
リストがすでに並べ替えられていることがわかっている場合は、おそらくもっと効率的な方法があります。
配列を並べ替えて、2000 より大きい最初の値を見つけたら、その値と前の値を取得します。