J'essaie d'écrire un programme qui modifie la matrice des entrées de l'utilisateur dans une boucle while et continue de recevoir des entrées jusqu'à ce que l'utilisateur entre une chaîne.
C'est essentiellement mon objectif final:
while True: x=input() y=int(input()) i[x][y]=1 if x=="t": break print(i) outputs TypeError: list indices must be integers or slices, not str
J'ai essayé plusieurs méthodes, mais je n'ai toujours pas réussi à obtenir ce que je voulais:
while True: x=input() y=input() if type(y)==int and type(x)==int: i[x][y]=1 else: break print(i) This outputs original configuartion [[0,0,0,0,0], [0,0,0,0,0], [0,0,0,0,0], [0,0,0,0,0]]
J'ai aussi essayé celle-ci:
for a matrix i=[[0,0,0,0,0], [0,0,0,0,0], [0,0,0,0,0], [0,0,0,0,0]] user input: 2 3 3 3 t for user inputs, the first integer specifies the row, and the next one following it specifies the column. expected output: i=[[0,0,0,0,0], [0,0,1,0,0], [0,0,1,0,0], [0,0,0,0,0]]
3 Réponses :
input () renvoie un 'str' donc i [ x] Les index de la liste de relances doivent être des entiers ou des tranches, et non str '
Alors, à quoi devrait ressembler leur approche?
@roganjosh - Je ne suis pas sûr de comprendre votre question. S'il vous plaît, expliquez.
Eh bien, si vous renversez la situation et que c'était une réponse à votre question, comment procéderiez-vous pour la mettre en œuvre? Cela ne dit rien sur ce que devrait être l'approche réelle
J'ai compris ... Je pensais que la solution était évidente - essayez de convertir en int et si cela échoue, demandez à l'utilisateur d'insérer à nouveau l'entrée.
La solution peut être évidente pour vous, mais pas nécessairement si vous vous mettez à la place du PO :)
Vous êtes confronté à plusieurs problèmes ici.
Tout d'abord, vous devez convertir l'entrée en index de liste, mais seulement si la première entrée (x) n'est pas 't'. J'ai ajouté cette comparaison au début de la boucle, donc nous terminons la boucle sans même nous soucier de y.
Ensuite, les deux entrées x et y sont converties en int (en utilisant int ()), et nous soustrayons 1 de chacun d'entre eux car je comprends que l'utilisateur doit saisir des index matriciels "naturels" (commençant à 1), au lieu d'indices python (commençant à zéro).
x = check_x(input())
Notez qu'une vérification supplémentaire des entrées serait en fait effectuée ici, mais je l'ai gardée minimale pour cette réponse.
Un exemple de fonction de vérification d'entrée serait le suivant:
def check_x(x_local): if len(x_local) is not 1: raise ValueError() return x_local
Cela ferait l'affaire :) Un peu de réorganisation et de conversion de type lors de l'indexation au lieu de sur input (), corrige beaucoup d'autres problèmes en jeu également
i=[[0,0,0,0,0], [0,0,0,0,0], [0,0,0,0,0], [0,0,0,0,0]] while True: x=input() y=input() """ As we're unsure when we'd like to break, lets assume t could be in x or y """ if x == "t" or y == "t": break """ Convert both inputs to ints """ else: i[int(x)][int(y)]=1 print(i)
if type (y) == int
échouera toujours car l'entrée utilisateur est toujours une chaîne. Vous avez besoin d'unessayez
/sauf
pour voir si la chaîne d'entrée peut éventuellement être convertieAvec un
essayez
/sauf
ce commentaire ne signifiera pas grand-chose, mais vous devriez également utiliserisinstance
pour vérifier les types