文字のリストとインデックスのリストがあります
myList = ['a','b','c','d']
toRemove = [0,2]
これを1回の操作で取得したい
myList = ['b','d']
できるのですが、もっと速くする方法はありますか?
toRemove.reverse()
for i in toRemove:
myList.pop(i)
文字のリストとインデックスのリストがあります
myList = ['a','b','c','d']
toRemove = [0,2]
これを1回の操作で取得したい
myList = ['b','d']
できるのですが、もっと速くする方法はありますか?
toRemove.reverse()
for i in toRemove:
myList.pop(i)
簡潔な答え
>>> myList = ['a','b','c','d']
>>> toRemove = [0,2]
>>>
>>> [v for i, v in enumerate(myList) if i not in toRemove]
['b', 'd']
>>>
他の回答が示唆しているようにリスト内包表記を使用できますが、本当に高速にする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 以上など) 場合を除き、速度の違いは目立たないことに注意してください。
必要に応じて、を使用できます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
。
一発ギャグ:
>>>[myList[x] for x in range(len(myList)) if not x in [0,2]]
['b', 'd']
あなたのためにそれを行う関数を書くことができます。
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'] になりました