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)
3 Réponses :
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 =).
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é.
Merci beaucoup! Cela a été très utile pour comprendre le fonctionnement de la division, etc.
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)
Où *
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*
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 lafind_treasure
fonction à cet autre code? vous ne renvoyez pas la liste, cela pourrait être un problème?