0
votes

Différence entre une boucle dans un appel de fonction et la liste explicite de tous les arguments

J'ai une fonction qui trie une liste de listes par la première liste. Quand j'utilise la fonction avec les variables comme ceci:

OUT = sort_lists(data_sort[idx] for idx in range(len(IN[0])))

cela fonctionne parfaitement. Bien que, comme je ne sais pas combien de listes mon entrée contient, je souhaite utiliser ceci comme variable:

def sort_lists(*args):
    zipped_list= zip(*sorted(zip(*args)))
    return [list(l) for l in zipped_list]

OUT = sort_lists(data_sort[0],data_sort[1],data_sort[2])

Bien que cela renvoie un tri d'une liste (la superliste ). Pourquoi y a-t-il une différence entre ces variables, et comment puis-je améliorer le code?

Voici la fonction si décisive (ici IN [0] est l'entrée avec un certain nombre de sous-listes):

sort_lists(IN[idx] for idx in range(len(IN)))

Je souhaite utiliser cette sortie:

sort_lists(IN[0],IN[1],IN[2])


4 commentaires

C'est la différence entre les arguments: foo (a, b, c) et un argument qui est une liste: foo ([a, b, c]) . Cependant, vous utilisez déjà * args - savez-vous ce qu'il fait?


@ Ry- Je sais que * args me permet d'avoir un nombre non donné d'arguments comme entrée. Bien que comment puis-je utiliser cela dans ma sortie?


Je ne suis pas tout à fait sûr de ce que vous essayez de faire avec votre fonction. Pouvez-vous donner un exemple pour IN et le OUT attendu correspondant? Mais comme @ Ry- déjà mentionné, la première fois que vous passez 3 listes séparées, et la deuxième fois, vous donnez essentiellement un objet générateur comme seul argument de la fonction.


@DocDriven Ce que je veux faire (et que je peux faire maintenant avec un nombre connu d'entrées) est de trier un certain nombre de listes selon le modèle de tri de la première liste. Disons que j'ai un IN [0] = [2,4,3,1], et un in IN [1] = ["two", "four", "three", "one"]. Ma sortie est OUT = [1,2,3,4], ["un", "deux", "trois", "quatre"].


3 Réponses :


0
votes

Changez simplement la fonction pour accepter la liste des listes, est-ce un problème? Ce morceau de code:

IN[idx] for idx in range(len(IN))

renvoie à nouveau la liste des listes


1 commentaires

Comment feriez-vous cela? Toutes mes excuses, mais je suis nouveau sur Python.



2
votes

Deux choses à comprendre ici:

Vous pouvez voir en quoi vos entrées sont différentes si vous ajoutez simplement l'instruction print dans votre fonction:

>>> sort_lists(*lists)
[[1, 2, 3], [3, 1, 4], [4, 5, 2]]

Laissez l'entrée liste des listes: lists = [[2, 1, 3], [1, 3, 4], [5, 4, 2]] .

def sort_lists(arg):
    zipped_list= zip(*sorted(zip(*arg)))
    return [list(l) for l in zipped_list]

sort_lists(lists[idx] for idx in range(len(lists)))
# [[1, 2, 3], [3, 1, 4], [4, 5, 2]]


1 commentaires

Oh wow. Merci d'avoir répondu! Je viens de déballer mes listes dans la sortie et cela fonctionne comme je le voulais maintenant.



0
votes

Comme l'a souligné Georgy, la différence réside dans le fait que les arguments sont un générateur ou une liste. Je tiens également à souligner que c'est l'occasion d'utiliser et de pratiquer la méthode map . map applique la même fonction à chaque entrée d'une liste. La fonction peut être intégrée comme sorted.

[[1, 2, 3], [1, 3, 4], [2, 4, 5]]

Returns:

list_a = [[2, 1, 3], [1, 3, 4], [5, 4, 2]]
sorted_list_a = list(map(sorted, list_a)) # sorted is the python built-in function
print(sorted_list_a)

Vous remarquerez que vous devrez passer votre carte à la fonction liste car map renvoie un objet cartographique, vous devez donc le transformer en liste .

La documentation de la carte est ici . Et un bon exemple est ici .

p >


0 commentaires