2009-10-19 11 views
8

Je suis familier avec la fonction input(), pour lire une seule variable depuis l'entrée de l'utilisateur. Existe-t-il un moyen similaire de lire deux variables?Lire deux variables sur une seule ligne avec Python

Je cherche l'équivalent de:

scanf("%d%d", &i, &j); // accepts "10 20\n" 

Une façon je suis en mesure d'y parvenir est d'utiliser raw_input() puis split ce qui a été entré. Y a-t-il une manière plus élégante?

Ceci n'est pas destiné à une utilisation en direct. Juste pour apprendre ..

Répondre

27

Non, la manière habituelle est raw_input().split()

Dans votre cas, vous pouvez utiliser map(int, raw_input().split()) si vous voulez être des entiers plutôt que des chaînes

Ne pas utiliser input() pour cela. Pensez à ce qui se passe si l'utilisateur entre

import os;os.system('do something bad')

+4

Notez qu'à partir de Python 3.0, 'raw_input' a été renommé en' input'. (Et pour obtenir le comportement original de 'input', utilisez' eval (entrée) '.) – Stephan202

+0

... qui devrait être" apply 'eval' à la sortie de' input' ". – Stephan202

+0

Oui, le comportement évident en 3 est beaucoup mieux, mais j'aurais aimé qu'ils aient laissé tomber quelques avertissements dans 2.6 concernant ces changements. Je suppose que j'ai besoin d'étudier le guide de mise à niveau –

9

Vous pouvez également lire sys.stdin

import sys 

a,b = map(int,sys.stdin.readline().split()) 
4

Je suis nouveau à ce genre de choses aussi bien. A fait un peu de recherche sur le site python.org et un peu de piratage pour que cela fonctionne. La fonction raw_input est de retour à nouveau, modifiée de entrée. C'est ce que je suis venu avec:

i,j = raw_input("Enter two values: ").split 
i = int(i) 
j = int(j) 

Accordé, le code est aussi élégant que les one-liners en utilisant C de scanf ou C++ 's cin. Le code Python se rapproche de Java (qui utilise un mécanisme entièrement différent de C, C++ ou Python) de sorte que chaque variable doit être traitée séparément.

En Python, la fonction raw_input obtient la console de caractères et les concaténer en un seul chaîne comme sa sortie. Quand une seule variable se trouve sur le côté gauche de l'opérateur d'affectation, le divisé pauses fonction cette String dans une liste de Chaîne valeurs.

Dans notre cas, où nous attendons deux variables, nous pouvons obtenir des valeurs en utilisant une liste séparée par des virgules pour leurs identifiants. Les valeurs de la chaîne sont ensuite affectées aux variables répertoriées. Si nous voulons faire de l'arithmétique avec ces valeurs, nous avons besoin de les convertir dans le int numérique (ou flotteur) type de données à l'aide intégrée Python int ou flotteur fonction.

Je sais que cet article est une réponse à une très vieille publication et probablement que la connaissance a été là en tant que «connaissance commune» pendant un certain temps.Cependant, j'aurais apprécié une publication comme celle-ci plutôt que de devoir passer quelques heures à chercher et à pirater jusqu'à ce que je trouve ce que je pensais être la solution la plus élégante qui puisse être présentée dans une salle de classe CS1.

1

Tout d'abord lire la ligne complète dans une chaîne comme

string = raw_input() 

Ensuite, utilisez une boucle comme celui-ci

prev = 0 
    lst = [] 
    index = 0 
    for letter in string : 
     if item == ' ' or item == '\n' : 
      lst.append(int(string[prev:index]) 
      prev = index + 1 

Cette boucle prend une ligne complète en entrée à la chaîne et traite les parties en il ajoute individuellement et ensuite les nombres à la liste - lst après les avoir convertis en entiers.

0

ou vous pouvez le faire

input_user=map(int,raw_input().strip().split(" ")) 
0

vous pouvez lire 2 valeurs int en utilisant ce en python 3.6.1

n,m = map(int,input().strip().split(" ")) 
+2

Pouvez-vous ajouter une explication de votre code et pourquoi il résout le problème? * Code seulement * les réponses ne sont souvent pas utiles. – Zabuza

0

Vous pouvez également utiliser cette méthode pour un certain nombre d'entrées. Considérez ce qui suit pour trois entrées séparées par des espaces:

import sys 

S = sys.stdin.read() 
S = S.split() 
S = [int(i) for i in S] 
l = S[0] 
r = S[1] 
k = S[2] 
Questions connexes