2013-10-13 4 views
1

Je représente un graphique en python dans une liste de cette manière:lecture des éléments adjacents dans le graphique en python

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

Ce que je veux maintenant tous les éléments adjacents d'un noeud particulier?

Pour par exemple

1 -> 2, 4, 5 
5 -> 1, 2, 3, 4, 6, 7, 8, 9 

Je comprends la façon de le faire serait de combinaisons i-1, i + 1, j-1, j + 1 avec i et j en lignes et en colonnes. Mais il semble naturel de convenir à une solution C où vous mettez des contraintes de limites dans les boucles for.

Existe-t-il une façon pythonique de le faire sans vérifier les contraintes de limites pour tous les 8 choix possibles.

Il n'y a pas de commande dont j'ai besoin. La matrice ici peut être n'importe quel m x n.

+0

Votre exemple est une liste, pas un dictionnaire. –

+0

@BasSwinckels Corrigé merci. – gizgok

+0

En fait, maintenant que je comprends enfin votre question, il semble que votre liste imbriquée représente réellement une matrice. –

Répondre

1

Vous pouvez utiliser itertools.product:

>>> from itertools import product 
>>> lis = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
>>> points = list(product([0, 1, -1], repeat=2))[1:] 
def get_adj_items(i, j, m, n, lis): 
    return [lis[i+x][j+y] for x, y in points 
             if 0 <= x+i < m and 0 <= y+j < n] 
... 
>>> get_adj_items(0, 0, 3, 3, lis) 
[2, 4, 5] 
>>> get_adj_items(1, 1, 3, 3, lis) 
[6, 4, 8, 9, 7, 2, 3, 1] 

matrice 2X4:

>>> lis = [[1, 2, 3 ,4], [5, 6 ,7 ,8]] 
>>> get_adj_items(1, 1, 2, 4, lis)  #items adjacent to 6 
[7, 5, 2, 3, 1] 
+0

Je mentionne d'ajouter un détail que la matrice ne sera pas un 3x3. Est-ce que cela fonctionnera pour une matrice mxn? – gizgok

+0

@gizgok Vous êtes dans une meilleure position pour tester si elle va ... – millimoose

+0

@gizgok Oui, il suffit d'utiliser '0 <= x + i

Questions connexes