将变量长度作为参数并返回元组的函数

时间:2017-09-01 10:19:08

标签: python-2.7 set tuples args

我编写的代码如下:

def convTup(*args):
    t = set([])
    for i in args:
        t.add(i)
    return tuple(t)

print convTup('a','b','c','d')
print convTup(1,2,3,4,5,6)
print convTup('a','b')

预期产出:

('a', 'b', 'c', 'd')
(1, 2, 3, 4, 5, 6)
('a', 'b')

但我输出如下:

('a', 'c', 'b', 'd')
(1, 2, 3, 4, 5, 6)
('a', 'b')

为什么元素的顺序仅针对('a','b','c','d')更改了?如何以与给定输入相同的顺序打印元组?

2 个答案:

答案 0 :(得分:1)

你可以使用它,你将有一个元组序列作为输入

>>> def f(*args):
    p = []
    [p.append(x) for x in args if x not in p]
    return tuple(p)

>>> f(1, 1, 2, 3)
(1, 2, 3)
>>> f('a', 'b', 'c', 'd')
('a', 'b', 'c', 'd')

此功能将创建一个唯一元素列表并跟踪其顺序,然后将其作为元组返回。

您可以使用设置而非列表查看相同的功能。集合不会跟踪元素的输入顺序。

>>> def tup1(*args):
    l = {x for x in args}
    return tuple(l)

>>> 
>>> tup1('a', 'b', 'c', 'd')
('a', 'c', 'b', 'd')

如果您在多个地方使用它,则可以实施自己的 SortedSet 集合。

答案 1 :(得分:0)

这应该做你需要的:

def convTup(*args):
    return sorted(tuple(set(args)), key=lambda x: args.index(x))

您将args转换为默认排序的set,然后将其转换为tuple,最后按原始顺序对tuple进行排序。

所以,准确地说,这个函数按照出现的顺序排序,只考虑args中元素的第一次出现。