1
votes

Comment modifier la matrice avec les entrées utilisateur dans la boucle while, et rompre lorsque l'utilisateur entre une chaîne?

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]]


2 commentaires

if type (y) == int échouera toujours car l'entrée utilisateur est toujours une chaîne. Vous avez besoin d'un essayez / sauf pour voir si la chaîne d'entrée peut éventuellement être convertie


Avec un essayez / sauf ce commentaire ne signifiera pas grand-chose, mais vous devriez également utiliser isinstance pour vérifier les types


3 Réponses :


0
votes

input () renvoie un 'str' donc i [ x] Les index de la liste de relances doivent être des entiers ou des tranches, et non str '


5 commentaires

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 :)



0
votes

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


0 commentaires

0
votes

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)


0 commentaires