3

私は2つのリストを持っています:

list_a = [1,5,8]
list_b = [12,4,2,5,7,5,3,6,8]

の要素は、list_aの要素のインデックスに対応しlist_bます。両方のリストのサイズが 100 を超えています。

list_bインデックスが にある要素を削除するにはどうlist_aすればよいので、上のリストを取得すると、結果のリストは になり[12,2,5,7,3,6]ますか?

4

4 に答える 4

9

2 つのオプション:

  • リスト内包表記で新しいリストを作成します。

    newlist = [el for i, el in enumerate(oldlist) if i not in indices_to_delete]
    

    の場合、これはさらに高速になりindices_to_deleteますset

    indices_to_delete = set(indices_to_delete)
    newlist = [el for i, el in enumerate(oldlist) if i not in indices_to_delete]
    

    セット内のメンバーシップ テストは O(1) 対リスト内の O(n) であるためです。

  • インプレース リストから逆順に並べ替えられたインデックスを削除します。

    for index in sorted(indices_to_delete, reversed=True):
        del oldlist[index]
    

    アイテムを逆順で削除しないindices_to_deleteと、インデックスが小さいアイテムが削除されるため、インデックスが大きいアイテムが上に移動し、残りのアイテムは削除する必要があったアイテムと一致しなくなります。

于 2013-04-24T19:18:59.917 に答える
4

これにより、次のことが達成されます。

for delidx in reversed(toDelete):
  del otherList[delidx]

また、リスト内包表記を使用すると、次のようになります。

l2 = [elem for i, elem in enumerate(l1) if i not in toDelete]
于 2013-04-24T19:18:23.600 に答える
2

質問を理解した今

a = numpy.array(list2)
mask = [True]*len(a)
mask[list1] = False
print a[mask]
于 2013-04-24T19:18:32.027 に答える