x = (1,1,-13,8,5,0,4,-1,-4)
a = filter(lambda i,j: i == j, x)
print(tuple(a))
我收到错误而不是正确答案(1,-13,8,5,0,4,-1,-4)
。
我的错误是什么?
答案 0 :(得分:2)
x = (1,1,-13,8,5,0,4,-1,-4)
seen = []
answer = []
for elem in x:
if elem not in seen:
seen.append(elem)
answer.append(elem)
print(tuple(answer))
输出:
(1, -13, 8, 5, 0, 4, -1, -4)
答案 1 :(得分:1)
filter
将遍历x
并将每个元素传递给lamdba函数。但是,它一次只传递一个元素。因此,lambda函数不能接受两个元素(除非最后一个元素具有默认值)。
除此之外,有很多解决方案没有使用set
。例如,您可以使用collections.OrderedDict
,就像这样
x = (1, 1, -13, 8, 5, 0, 4, -1, -4)
from collections import OrderedDict
print tuple(OrderedDict.fromkeys(x))
# (1, -13, 8, 5, 0, 4, -1, -4)
如果元素的顺序无关紧要,你可以使用普通的字典本身,比如
print tuple({}.fromkeys(x))
# (0, 1, 4, 5, 8, -13, -4, -1)
或者您可以使用临时seen
列表,例如
x = (1, 1, -13, 8, 5, 0, 4, -1, -4)
seen, result = [], tuple()
for item in x:
if item not in seen:
seen.append(item)
result += (item, )
print result
# (1, -13, 8, 5, 0, 4, -1, -4)
答案 2 :(得分:0)
假设您可能在列表中的任何位置有重复项,而不仅仅是连续重复,过滤器对您没有多大帮助。
您可以将reduce
与自定义功能结合使用:
reduce(lambda acc, e: acc if e in acc else acc + (e, ), x, ())
另外,如果你只想删除连续的重复,那也很容易:
reduce(lambda acc, e: acc if e in acc[-1:] else acc + (e, ), x, ())
或手工制作的代码
rv = []
for i in x:
if i not in rv: # any repetition
if i not in rv[-1:] # only successive repetitions
rv.append(i)
result = tuple(rv)
只是为了踢,这里有几个使用filter
的答案:
map(lambda i: x[i], filter(lambda i: x[i] not in x[:i], range(len(x)))
[sub[0] for sub in filter(lambda sub: sub[0] != sub[1], [x[i:i+2] for i in range(len(x)-1)])]
答案 3 :(得分:0)
x = (1, 1, -13, 8, 5, 0, 4, -1, -4)
print(tuple([item for index, item in enumerate(x) if item not in x[:index]]))
输出:
(1, -13, 8, 5, 0, 4, -1, -4)