IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

[AIDE] Trouver des "voisins" dans un tableau python [Python 3.X]


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    octobre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : octobre 2020
    Messages : 9
    Points : 9
    Points
    9
    Par défaut [AIDE] Trouver des "voisins" dans un tableau python
    Bonjour a tous !
    Je viens vers vous pour chercher de l'aide, Je dois compléter dans un programme une fonction qui me permettrait de trouver les voisin de certaines coordonnées dans un tableau avec un patron donné. Par exemple les voisins de [2,4] seraient [(1,3)(1,4)(1,5)(2,3)(2,5)(3,3)(3,4)(3,5)]. Jusque la, tout est simple, le problème arrive pour les coordonnées comme [0,0].
    Voila la Signature que mon professeur m'as donné :
    "Fonction qui retourne la liste des voisins de l'élément à la position (posLig,posCol) selon un certain patron
    Avec le patron par défaut, on retrouve les 3, 5 ou 8 voisins
    voisins(10,10,4,3) retourne [(3, 2), (3, 3), (3, 4), (4, 2), (4, 4), (5, 2), (5, 3), (5, 4)]
    voisins(10,10,0,0) retourne [(0, 1), (1, 0), (1, 1)]
    voisins(10,10,9,6) retourne [(8, 5), (8, 6), (8, 7), (9, 5), (9, 7)]
    voisins(10,10,9,6,[[0,0,1],[0,0,1],[1,1,1]]) retourne [(8, 7), (9, 7)]
    voisins(10,10,4,3,[[0,0,1],[0,0,1],[1,1,1]]) retourne [(3, 4), (4, 4), (5, 2), (5, 3), (5, 4)]
    Entrèe : nbLig : int, nbCol : int, posLig : int, posCol : int, patron : list (liste de listes)
    Sortie : list (une liste de tuples)
    "

    Et voila le code que j'ai fait (Une méthode très barbare, je n'ai pas trouvé mieux) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    def voisins(nbLig,nbCol,posLig,posCol,patron=[[1,1,1],[1,0,1],[1,1,1]]):
     
        listeVoisin=[]
        tabForet=[[0 for i in range(nbCol)] for j in range(nbLig)]
     
        if tabForet[posLig][posCol+1]==0 :
            listeVoisin.append((posLig,posCol+1))
        if tabForet[posLig][posCol-1]==0 :
            listeVoisin.append((posLig,posCol-1))
        if tabForet[posLig+1][posCol]==0 :
            listeVoisin.append((posLig+1,posCol))
        if tabForet[posLig-1][posCol]==0 :
            listeVoisin.append((posLig-1,posCol))
     
        if tabForet[posLig+1][posCol+1]==0 :
            listeVoisin.append((posLig+1,posCol+1))
        if tabForet[posLig-1][posCol+1]==0 :
            listeVoisin.append((posLig-1,posCol+1))
        if tabForet[posLig+1][posCol-1]==0 :
            listeVoisin.append((posLig+1,posCol-1))
        if tabForet[posLig-1][posCol-1]==0 :
            listeVoisin.append((posLig-1,posCol-1))
     
        return listeVoisin,tabForet
    Merci d'avance pour votre aide !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    17 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 17 869
    Points : 30 866
    Points
    30 866
    Par défaut
    Salut,

    Je ne comprends pas trop à quoi sert le patron passé en paramètre. D'ailleurs, dans la fonction, il n'est pas utilisé.

    Pour le reste, les voisins des indices (i, j) sont les indices (i+di, j+dj) pour tout di et dj distincts de zéros tous les 2 dans [-1, 0, 1].

    Ce qui brut de fonderie donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> for di in (-1,0,1):
    ...     for dj in (-1, 0, 1):
    ...         if di == dj == 0:
    ...            continue
    ...         print(i+di, j+dj)
    ...
    Lorsqu'on est sur les bords, on peut calculer les intervalles de variation de di, dj histoire de...
    Dans la pratique, çà fait plein de cas particuliers intéressant pour s'entrainer à écrire des conditions... mais qu'on évite en ajoutant des lignes/colonnes "neutres" au tableau (on fait varier i de 1 à M-1...).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    octobre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : octobre 2020
    Messages : 9
    Points : 9
    Points
    9
    Par défaut Problème réglé !
    J'ai trouvé la solution grâce a ce petit bout de code que vous m'avez donné, la voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    def voisins(nbLig,nbCol,posLig,posCol,patron=[[1,1,1],[1,0,1],[1,1,1]]):
     
        listeVoisin=[]
     
        for di in (-1,0,1):
            for dj in (-1, 0, 1):
                if not di==dj==0 and patron[di+1][dj+1]== 1:
                    listeVoisin.append((posLig+di, posCol+dj))
                if posLig+di < 0 :
                    if (posLig+di,posCol+dj) in listeVoisin :
                        listeVoisin.remove((posLig+di,posCol+dj))
                if posLig+di >= nbLig :
                    if (posLig+di,posCol+dj) in listeVoisin :
                        listeVoisin.remove((posLig+di,posCol+dj))
                if posCol+dj < 0 :
                    if (posLig+di,posCol+dj) in listeVoisin :
                        listeVoisin.remove((posLig+di,posCol+dj))
                if posCol+dj >= nbCol :
                    if (posLig+di,posCol+dj) in listeVoisin :
                        listeVoisin.remove((posLig+di,posCol+dj))
     
        return listeVoisin
    Cette situation est pour représenter un feu de foret, le patron sert a représenter le vent.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    17 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 17 869
    Points : 30 866
    Points
    30 866
    Par défaut
    Salut,

    Pourquoi retirer l'item que vous avez inséré plutôt qu'effectuer l'insertion si?

    Sinon avec Python on pourrait ecrire çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    gs = lambda u, m: { 0: (0, 1), m: (-1, 0) }.get(u, (-1, 0, 1)) 
    def f(i, j, m=3, n=3):
        dij = ((di, dj) for di in gs(i, m) for dj in gs(j, n))
        return [ (i+di, j+dj) for di, dj in dij if not(di == dj == 0) ]
    (sans le patron).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre chevronné

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    mars 2013
    Messages
    1 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : mars 2013
    Messages : 1 125
    Points : 2 120
    Points
    2 120
    Par défaut
    Sinon vous pouvez éviter les tests if également en vous servant des fonction min et max.
    Les voisins autour de la position (i,j) vont de (i-1,j-1) à (i+1,j+1), sauf si vous touchez un bord comme vous le dites.
    Mais donc dans ce cas, vous pouvez exprimer votre voisinage allant de (max(i-1,0),max(j-1,0)) à (min(i+1,Nx-1),min(j+1,Ny-1)) où (Nx,Ny) correspond à la taille de votre grille (vos nbLig et nbCol).

  6. #6
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    novembre 2010
    Messages
    2 984
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : novembre 2010
    Messages : 2 984
    Points : 8 271
    Points
    8 271
    Par défaut
    salut,

    on peut aussi au lieu de vérifier à chaque fois si on est en dehors des limites calculer dès le départ si on doit éliminer un bord ou un autre, et ainsi plutôt que d'itérer sur (-1,0,1) on n'itère que sur (-1,0) ou (0,1), pour le coût de seulement 4 tests par appel de la fonction

    version cracra ramassée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def voisins(nbLig, nbCol, posLig, posCol, patron=[[1,1,1],[1,0,1],[1,1,1]]):
        iterx = (-1,0,1) if 0 < posCol < nbCol-1 else ((-1,0) if 0 < posCol else (0,1))
        itery = (-1,0,1) if 0 < posLig < nbLig-1 else ((-1,0) if 0 < posLig else (0,1))
        return [(posLig+iy, posCol+ix) for ix in iterx for iy in itery if patron[iy+1][ix+1]]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Insérer des quotes dans un Clob
    Par bzerath dans le forum Débuter
    Réponses: 10
    Dernier message: 25/02/2011, 10h11
  2. Annuler échappement des quotes dans le message
    Par koKoTis dans le forum Langage
    Réponses: 11
    Dernier message: 20/10/2008, 12h33
  3. afficher des quotes dans un champ de formulaire
    Par benkunz dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 07/10/2007, 14h45
  4. supprimer une table qui a des quotes dans son nom
    Par kleenex dans le forum Access
    Réponses: 2
    Dernier message: 17/10/2005, 16h03
  5. Placer des quote dans un champs
    Par PrinceMaster77 dans le forum ASP
    Réponses: 2
    Dernier message: 21/04/2005, 10h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo