次のように任意の順序でカード スーツのリストがあるとします。
suits = ["h", "c", "d", "s"]
なしでリストを返したい'c'
noclubs = ["h", "d", "s"]
これを行う簡単な方法はありますか?
次のように任意の順序でカード スーツのリストがあるとします。
suits = ["h", "c", "d", "s"]
なしでリストを返したい'c'
noclubs = ["h", "d", "s"]
これを行う簡単な方法はありますか?
suits = ["h","c", "d", "s"]
noclubs = [x for x in suits if x != "c"]
>>> suits = ["h","c", "d", "s"]
>>> noclubs = list(suits)
>>> noclubs.remove("c")
>>> noclubs
['h', 'd', 's']
セパレートが不要な場合noclubs
>>> suits = ["h","c", "d", "s"]
>>> suits.remove("c")
フィルター (または itertools の ifilter) を使用できます。
suits = ["h","c", "d", "s"]
noclubs = filter(lambda i: i!='c', suits)
リスト構造を使用してフィルタリングすることもできます
suits = ["h","c", "d", "s"]
noclubs = [ i for i in suits if i!='c' ]
順序が重要でない場合は、集合操作を使用できます。
suits = ["h", "c", "d", "s"]
noclubs = list(set(suits) - set(["c"]))
# note no order guarantee, the following is the result here:
# noclubs -> ['h', 's', 'd']
for ループまたはラムダ関数を使用せず、順序を維持しない場合:
suits = ["h","c", "d", "s"]
noclubs = suits[:suits.index("c")]+suits[suits.index("c")+1:]
内部的にはまだループを使用することは承知していますが、少なくとも外部で使用する必要はありません。
残念ながら、デフォルトでPythonに組み込まれているようなものはないようです。
いくつかの答えがありますが、イテレータを使用して追加します。その場での変更が許容できる場合は、それが最速になります。オリジナルを変更したくなく、フィルターされたセットをループしたいだけなら、これはかなり速いはずです:
実装:
def without(iterable, remove_indices):
"""
Returns an iterable for a collection or iterable, which returns all items except the specified indices.
"""
if not hasattr(remove_indices, '__iter__'):
remove_indices = {remove_indices}
else:
remove_indices = set(remove_indices)
for k, item in enumerate(iterable):
if k in remove_indices:
continue
yield item
使用法:
li = list(range(5))
without(li, 3)
# <generator object without at 0x7f6343b7c150>
list(without(li, (0, 2)))
# [1, 3, 4]
list(without(li, 3))
# [0, 1, 2, 4]
したがって、これはジェネレーターですlist
。永続化するには、または何かを呼び出す必要があります。
単一のインデックスのみを削除したい場合は、もちろんk == remove_index
、セットの代わりに使用することでさらに高速化できます。