2017-09-01 65 views
0

我有如下編寫代碼:函數採用可變長度作爲參數,並返回元組

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')更改元素的順序?我如何以與給定輸入相同的順序打印元組?

+0

1)你的縮進是關閉的2)爲什麼不只是'返回元組(args)'? –

+0

@JohnColeman如果你的參數是一個列表,元組(參數)將引發TypeError – Vinny

+0

修正的壓痕和返回元組(參數)將得到所需要的output.But我想知道爲什麼順序只對(「A」變化, 'b','c','d')。 – RVR

回答

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集合如果您在多個地方使用它。

0

這應該做你需要的東西:

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

嗖您轉換成ARGS是set是默認排序,然後按原來的順序把它變成tuple最後那種tuple

所以,確切地說,這個函數按照外觀順序排序,只考慮args中元素的第一次出現。