26

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)

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

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

4

7 に答える 7

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

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

于 2010-01-26T20:40:17.797 に答える
9

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

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 に格納する必要がない場合、反復するメモリ効率も向上します。

于 2010-01-26T20:45:09.917 に答える
2
l=[('a', 1), ('b', 2), ('c', 3)]
k=1
l_without_num=l[:]   # or list(l) if you prefer
l_without_num.pop(k)
于 2010-01-26T20:53:27.033 に答える
2
new = [l[i] for i in range(len(l)) if i != k]
于 2010-01-26T21:05:00.767 に答える
1
#!/bin/bash
`python -c "'\n'.join(mylist[:])" 2>NULL | sed '/mybadelement/d'`

于 2012-11-20T18:59:33.150 に答える
0

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

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)

正しいことだとは思いませんが、短いです。:-)

于 2010-01-26T20:48:48.463 に答える