Existe uma maneira mais curta de obter a entrada do usuário em python?

17

Isto não é um desafio. Gostaria de saber se é possível obter a entrada do usuário em duas variáveis ​​separadas em python (2 ou 3) com menos de 19 bytes. Estes são os mais curtos que consigo:

a,b=input(),input()
a=input();b=input() (newline replaced with semicolon for readability)
i=input;a,b=i(),i()

Existe alguma maneira mais curta de fazer isso?

DJMcMayhem
fonte
2
O terceiro provavelmente seria o melhor se você estiver recebendo mais de duas entradas.
SuperJedi224
11
Eu ia dizer argumentos de linha de comando com a,b=sys.argv[1:2]ou o que quer, mas então você precisa de um import sys(certo?)
Alex A.
Em python3 a,b=input().split()haveria outra solução de 19 bytes, mas não uma melhoria. Observe que isso significa que aeb são strings e a entrada é inserida de uma só vez, separada por um espaço.
Matty 27/05
Não tenho certeza se isso ajuda, mas em alguns idiomas você pode usar um vetor para obter dois números, em vez de duas variáveis. Para duas variáveis ​​arbitrárias, um contêiner mais complicado pode ser usado.
Dennis Jaheruddin
a,b=input()em Py2
Oliver Ni

Respostas:

11

Se solicitar ao usuário não importa, isso é um pouco menor do que evalpara 3 ou mais:

a,b,c=map(input,[1]*3)
a,b,c=map(input,'111')

Também é mais curto, mesmo que o prompt não esteja ok:

a,b,c=map(input,['']*3)

Infelizmente, a ideia do xnor não salva nada para 2 entradas, pois ainda é mais longa (19 bytes). No entanto, se você já tiver alguma string (ou iterável apropriada) com o comprimento apropriado (porque mágica?), Ela poderá ser mais curta.

O xnor encontrou um exemplo de uma string mágica para 3 entradas apenas no Python 2:

a,b,c=map(input,`.5`)

Isso também requer que as solicitações não sejam importantes.

Na verdade, esse truque ajuda a salvar bytes para um grande número de entradas usando a 1eXnotação (obtendo x + 3 entradas):

 a,b,c,d,e,f=map(input,`1e3`)

Explicação:

A mapfunção do Python executa a função que é passada em cada elemento do iterável que também é passado para ele e retorna a lista (ou objeto de mapa) que contém os resultados dessas chamadas. Para o primeiro exemplo, o mapa pode ser decomposto em:

[input(1), input(1), input(1)]
FryAmTheEggman
fonte
2
Fazer map(input,'xxx')é igual para 3 varões, melhor para 2 e pior para 4 ou mais.
Xnor 27/05
3
Se, por algum acaso, você precisar de exatamente 22 entradas, map(input,`id`)é mais curto :-). Da mesma forma, map(input,`.1`)para 19 entradas.
xnor
3
Na verdade, a,b,c=map(input,`.5`)salva um caractere para 3 entradas, pois .5é representado como 0.5.
xnor 27/05
Sim isso é bom. Truque legal!
DJMcMayhem
6

Para 3 ou mais entradas, isso é mais curto:

a,b,c=eval("input(),"*3)
Keith Randall
fonte
4

Observe que, a menos que a pergunta especifique o tipo de entrada ou exija um programa completo, você poderá considerar a entrada como argumentos de função , eliminando a necessidade input() . Onde isso não é uma opção, o seguinte pode ajudar em certos casos.


Se você deseja caracteres únicos nas variáveis ae b, pode usar

a,b=input()

A inserção de uma sequência de 2 caracteres resultará no primeiro caractere sendo atribuído ae no segundo caractere b. (Menos de 2 ou mais de 2 caracteres na cadeia resultarão em erro.)

Se você precisar de mais de um caractere por variável, essa abordagem não funcionará. Isso ainda pode ser usado para inserir dois números de um dígito como uma sequência. Se números além de 9 forem necessários, toda a gama de caracteres de entrada em potencial poderá ser interpretada como números.

Observe que isso também funciona para mais de 2 variáveis:

a,b,c,d,e,f,g,h=input()

Isso funciona porque no Python uma string é uma sequência de caracteres e pode ser usada em qualquer lugar em que uma sequência seja esperada.

Trichoplax
fonte