получение списка без k-го элемента эффективно и неразрушающе - PullRequest
24 голосов
/ 26 января 2010

У меня есть список в Python, и я хотел бы перебрать его и выборочно создать список, который содержит все элементы, кроме текущего k-го элемента. Я могу сделать это одним из следующих способов:

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)

но это кажется неэффективным и не элегантным. Есть ли простой способ сделать это? note Примечание Я хочу получить по существу фрагмент исходного списка, который исключает текущий элемент. кажется, должен быть более простой способ сделать это.

спасибо за вашу помощь.

Ответы [ 7 ]

59 голосов
/ 26 января 2010
l = [('a', 1), ('b', 2), ('c', 3)]
k = 1
l_without_num = l[:k] + l[(k + 1):]

Это то, что вы хотите?

9 голосов
/ 26 января 2010

Было бы полезно, если бы вы объяснили больше, как вы хотите его использовать. Но вы можете сделать то же самое с пониманием списка.

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.

2 голосов
/ 26 января 2010
l=[('a', 1), ('b', 2), ('c', 3)]
k=1
l_without_num=l[:]   # or list(l) if you prefer
l_without_num.pop(k)
1 голос
/ 20 ноября 2012
#!/bin/bash
`python -c "'\n'.join(mylist[:])" 2>NULL | sed '/mybadelement/d'`

лол

1 голос
/ 27 января 2010
new = [l[i] for i in range(len(l)) if i != k]
0 голосов
/ 06 августа 2015

Использование разностного оператора на множествах:

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

l=[('a', 1), ('b', 2), ('c', 3)]
list(set(l).difference([l[1]]))
[('a', 1), ('c', 3)]
0 голосов
/ 26 января 2010

Вероятно, не самый эффективный, но функциональный программист во мне, вероятно, написал бы это.

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)

Я не думаю, что это правильно , что нужно сделать, но оно короткое. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...