4

2D リストがあり、要素のインデックスを検索する必要があります。私はプログラミングの初心者なので、次の関数を使用しました。

def in_list(c):
    for i in xrange(0,no_classes):
        if c in classes[i]:
            return i;

    return -1

ここで、classes は 2D リストであり、no_classes はクラスの数、つまりリストの最初の次元を示します。c が配列にない場合は -1 が返されます。検索を最適化できるものはありますか?

4

4 に答える 4

4

自分自身を定義する必要はありませんno_classes。使用enumerate():

def in_list(c, classes):
    for i, sublist in enumerate(classes):
        if c in sublist:
            return i
    return -1
于 2013-08-04T09:43:28.753 に答える
1

順序が問題ではなく、データに重複がない場合は、2D リストをセットのリストに変換することをお勧めします。

>>> l = [[1, 2, 4], [6, 7, 8], [9, 5, 10]]
>>> l = [set(x) for x in l]
>>> l
[set([1, 2, 4]), set([8, 6, 7]), set([9, 10, 5])]

その後、セット内の要素の検索は一定であるため(リスト内の要素の検索は線形)、元の関数はより高速に動作するため、アルゴリズムはO(N ^ 2)ではなくO(N)になります。

関数でこれを行うべきではないことに注意してください。そうしないと、関数が呼び出されるたびに変換されます。

于 2013-08-04T10:18:06.260 に答える
1

list.index(item) を使用

a = [[1,2],[3,4,5]]

def in_list(item,L):
    for i in L:
        if item in i:
            return L.index(i)
    return -1

print in_list(3,a)
# prints 1
于 2013-08-04T09:42:19.607 に答える
0

「2D」リストが長方形(各行の列数が同じ)の場合、それをに変換し、numpy.ndarraynumpy 機能を使用して検索を行う必要があります。

a = np.array(c)
i,j = np.where(a==element)

i行インデックスとj列インデックスがそれぞれ含まれます。

例:

a = np.array([[1,2],
              [3,4],
              [2,6]])
i,j = np.where(a==2)
print i
#array([0, 2])
print j
#array([1, 0]))
于 2013-08-04T10:53:46.977 に答える