У меня есть список в Python, и я хотел бы выполнить итерации через него и выборочно создать список, который содержит все элементы кроме текущего k'th элемента. одним путем я могу сделать это, это:
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)
но это кажется неэффективным и неэлегантным. существует ли простой способ сделать это? обратите внимание, что я хочу получить по существу часть исходного списка, который исключает элемент тока. кажется, что должен быть более легкий способ сделать это.
спасибо за Вашу справку.
l = [('a', 1), ('b', 2), ('c', 3)]
k = 1
l_without_num = l[:k] + l[(k + 1):]
Ты этого хочешь?
l=[('a', 1), ('b', 2), ('c', 3)]
k=1
l_without_num=l[:] # or list(l) if you prefer
l_without_num.pop(k)
, вероятно, не самый эффективный, но функциональный программист во мне, вероятно, написал бы это.
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)
Я не думаю, что это правильно вещь, но это коротко. : -)
Это помогло бы, если вы объясните, как вы хотели его использовать. Но вы можете сделать то же самое с пониманием списка.
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.