web-dev-qa-db-ja.com

k番目の要素のないリストを効率的かつ非破壊的に取得する

pythonにリストがあり、それを繰り返し処理して、現在のk番目の要素を除くすべての要素を含むリストを選択的に作成したいと思います。1つの方法は次のとおりです。この:

l = [('a', 1), ('b', 2), ('c', 3)]
for num, elt in enumerate(l):
  # construct list without current element
  l_without_num = copy.deepcopy(l)
  l_without_num.remove(elt)

しかし、これは非効率的でエレガントではないようです。それを行う簡単な方法はありますか?基本的に、現在の要素を除外した元のリストのスライスを取得したいことに注意してください。これを行うためのより簡単な方法があるはずのようです。

ご協力ありがとうございました。

24
user248237
l = [('a', 1), ('b', 2), ('c', 3)]
k = 1
l_without_num = l[:k] + l[(k + 1):]

これは、あなたの望むことですか?

62
Chris B.

どのように使いたいかをもっと説明していただければ助かります。しかし、リスト内包表記でも同じことができます。

l = [('a', 1), ('b', 2), ('c', 3)]
k = 1
l_without_num = [elt for num, elt in enumerate(l) if not num == k]

これは、l_without_numに格納する必要がない場合、反復するのにメモリ効率も高くなります。

9
vogonistic
l=[('a', 1), ('b', 2), ('c', 3)]
k=1
l_without_num=l[:]   # or list(l) if you prefer
l_without_num.pop(k)
2
John La Rooy
new = [l[i] for i in range(len(l)) if i != k]
2
inspectorG4dget
#!/bin/bash
`python -c "'\n'.join(mylist[:])" 2>NULL | sed '/mybadelement/d'`

1
Dan Mantyla

おそらく最も効率的ではありませんが、私の関数型プログラマーはおそらくこれを書くでしょう。

import operator
from itertools import *
def inits(list):
    for i in range(0, len(list)):
        yield list[:i]
def tails(list):
    for i in range(0, len(list)):
        yield list[i+1:]
def withouts(list):
    return imap(operator.add, inits(list), tails(list))

for elt, without in izip(l, withouts(l)):
    ...

import functools, operator
for elt in l:
    without = filter(functools.partial(operator.ne, elt), l)

rightやるべきことではないと思いますが、短いです。 :-)

0
ephemient

セットでの差分演算子の使用:

list(set(l).difference([l[k]])

l=[('a', 1), ('b', 2), ('c', 3)]
list(set(l).difference([l[1]]))
[('a', 1), ('c', 3)]
0
rajivRaja