我在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)
但这似乎效率低下且不够优雅。有一个简单的方法吗?注意我想基本上得到一个排除当前元素的原始列表。似乎应该有一个更简单的方法来做到这一点。
谢谢你的帮助。
答案 0 :(得分:59)
l = [('a', 1), ('b', 2), ('c', 3)]
k = 1
l_without_num = l[:k] + l[(k + 1):]
这是你想要的吗?
答案 1 :(得分: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中,那么迭代的内存效率会更高。
答案 2 :(得分: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)
答案 3 :(得分:1)
new = [l[i] for i in range(len(l)) if i != k]
答案 4 :(得分:1)
#!/bin/bash
`python -c "'\n'.join(mylist[:])" 2>NULL | sed '/mybadelement/d'`
洛尔
答案 5 :(得分: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)
我不认为这是正确的事情,但它很短。 : - )
答案 6 :(得分:0)
在集合上使用差值运算符:
list(set(l).difference([l[k]])
l=[('a', 1), ('b', 2), ('c', 3)]
list(set(l).difference([l[1]]))
[('a', 1), ('c', 3)]