6

2 つのリストがあります。

最初のリストは、リストの前の方が良いように (他の基準によって) 既にソートされています。

sortedList = ['200', '050', '202', '203', '206', '205', '049', '047', '042', '041', '043', '044', '046', '045', '210', '211', '306', '302', '308', '309', '311', '310', '221', '220', '213', '212']

2 番目のリストは、許可される値のリストです。

allowedList = ['001','002','003','004','005','006','007','008','009','010','203','204','205','206','207','212','213','215','216']

allowedList に存在するソートされた最高の値を選択したいのですが、これを行うためのばかげた方法しか考えていません。このようなもの:

import numpy as np
temp = []
for x in allowedList:
    temp.append(sortedList.index(x))
np.min(temp)

これよりも良い方法があるはずです。何か案は?

4

3 に答える 3

3

numpyなしでこれを行う方法は次のとおりです

>>> sorted_list = ['200', '050', '202', '203', '206', '205', '049', '047', '042', '041', '043', '044', '046', '045', '210', '211', '306', '302', '308', '309', '311', '310', '221', '220', '213', '212']
>>> allowed_list = ['001','002','003','004','005','006','007','008','009','010','203','204','205','206','207','212','213','215','216']
>>> allowed_set = set(allowed_list)
>>> next((x for x in sorted_list if x in allowed_set), None)
'203'
于 2012-08-23T07:34:46.890 に答える
2

すでにソートされているという事実を使用したソリューションallowedlistは、おそらくより効率的です (およびを使用するsetと、確かに - 線形時間と二次時間になります) が、完全を期すためにのみ、既存のソリューションを大幅に短縮し、一時的なリストを削除できます。

min(allowedList, key=sortedList.index)

これは、numpy のものではなく、Python の組み込みmin関数np.minを使用します。主に、numpy 配列でそれらを使用している場合にのみ役立ちます。リストを使用する場合は必要ありません。

于 2012-08-23T07:46:34.857 に答える
0
allowedSet = set(allowedList)
i, a = next(((i, a) for i, a in enumerate(sortedList) if a in allowedSet), (-1, None))

iはそのような最初の要素のインデックス (3)、aその要素 ('203') です。

いずれにせよ、2 つのリストに共通の要素がない場合は、i = -1自分a = Noneで変更できます。

于 2012-08-23T07:43:45.573 に答える