63

次のように任意の順序でカード スーツのリストがあるとします。

suits = ["h", "c", "d", "s"]

なしでリストを返したい'c'

noclubs = ["h", "d", "s"]

これを行う簡単な方法はありますか?

4

9 に答える 9

61
suits = ["h","c", "d", "s"]

noclubs = [x for x in suits if x != "c"]
于 2013-04-01T06:30:19.867 に答える
55
>>> suits = ["h","c", "d", "s"]
>>> noclubs = list(suits)
>>> noclubs.remove("c")
>>> noclubs
['h', 'd', 's']

セパレートが不要な場合noclubs

>>> suits = ["h","c", "d", "s"]
>>> suits.remove("c")
于 2013-04-01T06:30:35.480 に答える
8

フィルター (または 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' ]
于 2013-04-01T11:34:04.207 に答える
6

順序が重要でない場合は、集合操作を使用できます。

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']
于 2013-04-01T06:58:49.217 に答える
4

for ループまたはラムダ関数を使用せず、順序を維持しない場合:

suits = ["h","c", "d", "s"]
noclubs = suits[:suits.index("c")]+suits[suits.index("c")+1:]

内部的にはまだループを使用することは承知していますが、少なくとも外部で使用する必要はありません。

于 2015-09-12T00:03:12.943 に答える
0

残念ながら、デフォルトで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、セットの代わりに使用することでさらに高速化できます。

于 2016-10-12T16:22:20.037 に答える