2017-09-01 5 views
0

J'ai le code écrit ci-dessous:fonction qui prend une longueur variable comme argument et retourne tuple

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') 

Sortie prévue:

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

mais je m'y suis sortie comme ci-dessous:

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

Pourquoi l'ordre des éléments n'a-t-il changé que pour ('a','b','c','d')? Comment puis-je imprimer le tuple dans le même ordre que l'entrée donnée?

+0

1) votre indentation est désactivée 2) pourquoi ne pas juste 'retourner tuple (args)'? –

+0

@JohnColeman Si votre paramètre est une liste, tuple (args) soulèverait un TypeError – Vinny

+0

indentation corrigée & return tuple (args) donnera la sortie attendue. Mais je veux savoir pourquoi l'ordre change seulement pour ('a', «b», «c», «d»). – RVR

Répondre

1

Vous pouvez utiliser cela et vous aurez une séquence de tuple comme entrée

>>> 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') 

Cette fonction crée une liste d'éléments uniques et de suivre leur ordre puis revenir comme un tuple.

Vous pouvez voir la même fonctionnalité en utilisant un au lieu de la liste. Un ensemble ne tient pas compte de l'ordre dans lequel les éléments ont été entrés.

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

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

Vous pouvez mettre en œuvre votre propre SortedSet collection si vous l'utilisez en plusieurs endroits.

0

Cela devrait faire ce que vous avez besoin: par l'ordre d'origine

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

vous Sou convertir args en set qui est ordonné par défaut, puis la transformer en tuple et enfin sorte que tuple. Donc, pour être précis, cette fonction se commande par ordre d'apparition en ne prenant en compte que la première apparition d'élément dans les args.