5

文字のリストとインデックスのリストがあります

myList = ['a','b','c','d']
toRemove = [0,2]

これを1回の操作で取得したい

myList = ['b','d']

できるのですが、もっと速くする方法はありますか?

toRemove.reverse()
for i in toRemove:
    myList.pop(i)
4

5 に答える 5

5

簡潔な答え

>>> myList = ['a','b','c','d']
>>> toRemove = [0,2]
>>> 
>>> [v for i, v in enumerate(myList) if i not in toRemove]
['b', 'd']
>>> 
于 2012-06-07T22:09:57.390 に答える
5

他の回答が示唆しているようにリスト内包表記を使用できますが、本当に高速にするsetために、削除する一連のインデックスに a を使用することをお勧めします。

>>> myList = ['a','b','c','d']
>>> toRemove = set([0,2])
>>> [x for i,x in enumerate(myList) if i not in toRemove]
['b', 'd']

toRemove のすべての要素に対して myList のすべての要素をチェックすると、O(n*m) になります (n は myList の長さ、m は toRemove の長さです)。を使用するsetと、メンバーシップのチェックは O(1) になるため、手順全体が O(n) になります。ただし、toRemove が非常に大きい (1000 以上など) 場合を除き、速度の違いは目立たないことに注意してください。

于 2012-06-07T22:16:13.677 に答える
4

必要に応じて、を使用できますnumpy

import numpy as np

myList = ['a','b','c','d']
toRemove = [0,2]

new_list = np.delete(myList, toRemove)

結果:

>>> new_list
array(['b', 'd'], 
      dtype='|S1')

であることに注意してnew_listくださいnumpy array

于 2012-06-07T22:29:17.877 に答える
1

一発ギャグ:

>>>[myList[x] for x in range(len(myList)) if not x in [0,2]]
['b', 'd']
于 2012-06-07T22:10:56.147 に答える
0

あなたのためにそれを行う関数を書くことができます。

def removethese(list, *args):
    for arg in args:
        del list[arg]

それからする

mylist = ['a', 'b', 'c', 'd', 'e']
removethese(mylist, 0, 1, 4)

mylist は ['c', 'd'] になりました

于 2012-06-07T22:15:10.840 に答える