0
votes

En parcourant une liste de listes pour des valeurs spécifiques

J'ai besoin de lire un fichier .txt et de trouver un modèle spécifique de T, à savoir les T disposés en croix.

Voici ce que j'ai fait jusqu'à présent et sa sortie lorsque j'imprime est ci-dessous:

WWWWWWWWWWWWWWWWWWWWWWW.TTT..^^^^...WWWWWWWW
WWWWWWWWWWWWWWWWWWWWWW...T..^^^^....WWWWWWWW
WWWWWWWWWWWWWWWWWWWWWW......^^^......WWWWWWW
WWWWWWWWWWWWWWWWWWWWW..T.....^^^^..T.WWWWWWW
WWWWWWWWWWWWWWWWWWWWW........^^^^..T.WWWWWWW
WWWWWWWWWWWWWWWWWWWW........^^^....T.WWWWWWW
WWWWWWWWWWWWWWWWWWWW........^^^......WWWWWWW
WWWWWWWWWWWWWWWWWWWWWW.....^^^^.....WWWWWWWW
WWWWWWWWWWWWWWWWWWWWWW.....^^^......WWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWW....^^......WWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWW......^.....WWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWW............WWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWW....T......WWWWWWWWWWWWW
WWWWW...WWWWWWWWWWWWW..T.T.....WWWWWWWWWWWWW
WWWW..TTT.WWWWWWWWWWW...T.....WWWWWWWWWWWWWW
WWWWW.......WWWWWWWWWWW......WWWWWWWWWWWWWWW
WWWWWWWW...T.WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWW....WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWW.T.WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWW.WWWWWWWWWW.....WWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWW....T..WWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWW.TTT..WWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWW..T..WWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWW...WWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
W: WATER                                    
T: TREE                                     
.: GRASS                                    
^: MOUNTAIN 

Sortie Mon idée initiale était de faire quelque chose comme utiliser 2 boucles for pour parcourir chaque élément de la liste, puis regarder chaque lettre / caractère de l'élément lui-même, mais j'ai continué à recevoir des erreurs de plage d'index de liste ou cela ne fonctionne pas du tout.

for i in range(len(lst)):
    for j in range(len(lst[i])):
        if lst[i][j] == 'T':
            print('WHy')
        else:
            print('why am i here why')

Avez-vous des conseils les gars?

EDIT: Exemple d'entrée:

def find_treasure(mapfile):
    lst = []
    with open(mapfile, 'r') as rf:
        for line in rf:
            lst.append(line.split())
    print(lst)

Et le résultat attendu est: (21,25)


2 commentaires

Pouvez-vous modifier votre question et y mettre un exemple d'entrée (sous forme de texte - afin que nous puissions le copier) et la sortie attendue?


Je ne vois aucune raison pour obtenir l' indice des erreurs de portée étant donné le code que vous avez partagé, vous êtes sûr de la même lst valeur est d' obtenir de la find_treasure fonction à cet autre code? vous ne renvoyez pas la liste, cela pourrait être un problème?


3 Réponses :


1
votes

Ce n'est pas une réponse totale, mais je vois deux problèmes dans votre code.

Tout d'abord, comme Tadhg le mentionne, votre find_treasure ne renvoie aucune valeur, ce qui pourrait être à l'origine des range errors .

Une fois que vous vous connectez, votre autre bloc reste. Et la raison pour laquelle vous atteignez votre déclaration why am i here why c'est la cause de la méthode split() sans paramètre de separator qui divise simplement les blank spaces . Si vous voulez séparer chaque valeur de la ligne, vous devez utiliser lst.append(list(line)) cela créerait une matrice avec tous les éléments de votre entrée à accéder avec mat[][]

J'espère que cela vous aide =).


0 commentaires

0
votes

J'ai bien peur que l'erreur que vous obtenez ne soit causée par aucun des codes que vous avez partagés, votre boucle fonctionne parfaitement bien (à part line.split() divisant par des espaces qu'il n'y en a pas dans votre fichier, vous voulez probablement list(line) ou juste une line à diviser sur chaque caractère)

Ce script s'exécute sans erreur, démontrant que votre problème se trouve dans une autre partie de votre code:

import io

mock_file = io.StringIO("""WWWWWWWWWWWWWWWWWWWWWWW.TTT..^^^^...WWWWWWWW
WWWWWWWWWWWWWWWWWWWWWW...T..^^^^....WWWWWWWW
WWWWWWWWWWWWWWWWWWWWWW......^^^......WWWWWWW
WWWWWWWWWWWWWWWWWWWWW..T.....^^^^..T.WWWWWWW
WWWWWWWWWWWWWWWWWWWWW........^^^^..T.WWWWWWW
WWWWWWWWWWWWWWWWWWWW........^^^....T.WWWWWWW
WWWWWWWWWWWWWWWWWWWW........^^^......WWWWWWW
WWWWWWWWWWWWWWWWWWWWWW.....^^^^.....WWWWWWWW
WWWWWWWWWWWWWWWWWWWWWW.....^^^......WWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWW....^^......WWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWW......^.....WWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWW............WWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWW....T......WWWWWWWWWWWWW
WWWWW...WWWWWWWWWWWWW..T.T.....WWWWWWWWWWWWW
WWWW..TTT.WWWWWWWWWWW...T.....WWWWWWWWWWWWWW
WWWWW.......WWWWWWWWWWW......WWWWWWWWWWWWWWW
WWWWWWWW...T.WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWW....WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWW.T.WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWW.WWWWWWWWWW.....WWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWW....T..WWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWW.TTT..WWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWW..T..WWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWW...WWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
W: WATER                                    
T: TREE                                     
.: GRASS                                    
^: MOUNTAIN""")

def find_treasure(mapfile):
    lst = []
    with mapfile as rf:
        for line in rf:
            lst.append(list(line))
    print(lst)
    
    for i in range(len(lst)):
        for j in range(len(lst[i])):
            if lst[i][j] == 'T':
                print('WHy')
            else:
                print('why am i here why')

find_treasure(mock_file)

En raison de cela , je vérifieraient que la lst variable est la même dans les 2 sections mentionnées de code, car les erreurs de gamme ne se passerait - il à quelque chose de différent de ce que vous avez montré.


1 commentaires

Merci beaucoup! Cela a été très utile pour comprendre le fonctionnement de la division, etc.



1
votes

Je suppose que par "T arrangés en croix", vous entendez ceci:

lst = """WWWWWWWWWWWWWWWWWWWWWWW.TTT..^^^^...WWWWWWWW
WWWWWWWWWWWWWWWWWWWWWW...T..^^^^....WWWWWWWW
WWWWWWWWWWWWWWWWWWWWWW......^^^......WWWWWWW
WWWWWWWWWWWWWWWWWWWWW..T.....^^^^..T.WWWWWWW
WWWWWWWWWWWWWWWWWWWWW........^^^^..T.WWWWWWW
WWWWWWWWWWWWWWWWWWWW........^^^....T.WWWWWWW
WWWWWWWWWWWWWWWWWWWW........^^^......WWWWWWW
WWWWWWWWWWWWWWWWWWWWWW.....^^^^.....WWWWWWWW
WWWWWWWWWWWWWWWWWWWWWW.....^^^......WWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWW....^^......WWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWW......^.....WWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWW............WWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWW....T......WWWWWWWWWWWWW
WWWWW...WWWWWWWWWWWWW..T.T.....WWWWWWWWWWWWW
WWWW..TTT.WWWWWWWWWWW...T.....WWWWWWWWWWWWWW
WWWWW.......WWWWWWWWWWW......WWWWWWWWWWWWWWW
WWWWWWWW...T.WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWW....WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWW.T.WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWW.WWWWWWWWWW.....WWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWW....T..WWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWW.TTT..WWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWW..T..WWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWW...WWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW""".split('\n')

# Now lst is a list of strings, but that doesn't matter 
# because we can obtain characters in a string just like elements in a list
# duck typing FTW!

findCrosses(lst)

# Out: (21, 25)

* est tout sauf un T

Donc pour identifier un motif croisé centré à l'emplacement lst[i][j] , tous les indices qui l'entourent doivent être égaux à T

def findCrosses(lst):
    for i in range(1, len(lst) - 1):
        row = lst[i]
        for j in range(1, len(row) - 1):
            # Copy the isCrossAt logic here to save a function call
            foundCross = lst[i - 1][j] == 'T' and \
                         lst[i + 1][j] == 'T' and \
                         lst[i][j - 1] == 'T' and \
                         lst[i][j + 1] == 'T' and \
                         lst[i][j] == 'T'
            if foundCross:
                return (i, j)

Cela signifie que vous devez uniquement vérifier les croix centrées entre la deuxième et l'avant-dernière ligne et entre la deuxième et l'avant-dernière colonne.

def isCrossAt(lst, i, j):
    return lst[i - 1][j] == 'T' and \
           lst[i + 1][j] == 'T' and \
           lst[i][j - 1] == 'T' and \
           lst[i][j + 1] == 'T' and \
           lst[i][j] == 'T'

Testons cela en utilisant votre chaîne.

*T*
TTT
*T*


0 commentaires