在不使用set()的情况下删除元组中的重复项

时间:2014-04-10 15:38:25

标签: python set duplicates tuples

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)。 我的错误是什么?

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)