26

我在 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)

但这似乎效率低下且不优雅。有简单的方法吗?请注意,我基本上想获得不包括当前元素的原始列表的一部分。似乎应该有一种更简单的方法来做到这一点。

感谢您的帮助。

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 回答
1

在集合上使用差分运算符:

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

l=[('a', 1), ('b', 2), ('c', 3)]
list(set(l).difference([l[1]]))
[('a', 1), ('c', 3)]
于 2015-08-06T01:20:24.877 回答
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 回答