La tâche consiste à coder un algorithme de tri en utilisant le code ci-dessous comme point de départ. Le problème est que je n'arrive pas à comprendre comment je commence le code, je ne cherche pas la solution complète - juste des techniques pour trier les listes de tuples qui font réellement partie d'un objet. J'obtiens des erreurs lorsque j'essaie de parcourir la liste, en disant que je ne peux pas parcourir un objet.

class LinkedList:
    def __init__(self, data):
        self.label = data[0][0]
        self.value = data[0][1]
        self.tail = None if (len(data) == 1) else LinkedList(data[1:])

countries = LinkedList([("Ukraine",41879904),("Brunei",442400),("Christmas Island (Australia)",1928)
1
NateD0gg83 4 juin 2020 à 18:32

3 réponses

Meilleure réponse

Pour parcourir cette liste, vous devez continuer à obtenir la référence de fin de l'objet:

class LinkedList:
  def __init__(self, data):
    self.label = data[0][0]
    self.value = data[0][1]
    self.tail = None if (len(data) == 1) else LinkedList(data[1:])

countries = LinkedList([("Ukraine",41879904),("Brunei",442400),("Christmas Island (Australia)",1928)])
nextObj = countries

while nextObj is not None:
  print(nextObj.label, nextObj.value)
  nextObj = nextObj.tail

print("done!")

Production:

Ukraine 41879904
Brunei 442400
Christmas Island (Australia) 1928
done!

Pour obtenir un élément à un certain index, vous commencez à itérer à partir du premier élément et gardez simplement un compteur.

0
Aziz Sonawalla 4 juin 2020 à 15:39

Vous pouvez utiliser un pointeur pour parcourir une liste liée:

curr = countries

while curr:
    print("Label {}, Value {}".format(curr.label, curr.value))
    curr = curr.tail

Afin de trier la liste liée, vous devez tout d'abord implémenter des fonctions d'assistance pour supprimer / insérer un nœud dans une liste liée donnée à une certaine position. Une fois que vous avez de telles méthodes, vous pouvez implémenter l'un des célèbres algorithmes de tri (par exemple, le tri rapide) en utilisant les méthodes d'aide que vous venez de créer.

1
Vorashil Farzaliyev 4 juin 2020 à 15:45

functools, @total_ordering

L'une des fonctionnalités puissantes de python. vous pouvez trier les objets de manière classique et simple. Le module Functools en python aide à implémenter des fonctions d'ordre supérieur. Les fonctions d'ordre supérieur sont des fonctions dépendantes qui appellent d'autres fonctions. Total_ordering fournit des méthodes de comparaison de classes riches qui aident à comparer des classes sans définir explicitement une fonction pour elle. Donc, cela aide à la redondance du code.

Il y a 2 conditions essentielles pour mettre en œuvre ces méthodes de comparaison

Au moins une des méthodes de comparaison doit être définie à partir de lt (inférieur à), le (inférieur ou égal à), gt (supérieur à) ou ge (supérieur ou égal à).

La fonction eq doit également être définie

from functools import total_ordering

@total_ordering
class LinkedList(object):
    def __init__(self, data):
        self.label = data[0][0]
        self.value = data[0][1]

    def __lt__(self, other):
        return self.label < other.value  ##lets assume that the sort is based on label data member(attribute)

    def __eq__(self, other):
        return self.label == other.value

##I dont know what data is. just pass your data objects to list of LinkedList objects. and sort it with sorted method (treat them like int objects)! 
my_list = [LinkedList(data0),LinkedList(data1),LinkedList(data2)]

new_list=my_list.sorted()
for obj in new_list:
    print(...)
1
Adam 4 juin 2020 à 15:57