Có cách nào ngắn hơn để có được đầu vào của người dùng trong python không?


17

Đây không phải là một thách thức. Tôi tự hỏi liệu có thể đưa đầu vào của người dùng vào hai biến riêng biệt trong python (2 hoặc 3) với ít hơn 19 byte. Đây là tất cả những gì ngắn nhất tôi có thể nhận được:

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

Có cách nào ngắn hơn để làm điều này?


2
Cái thứ ba có lẽ sẽ là tốt nhất nếu bạn tham gia nhiều hơn hai đầu vào.
SuperJedi224

1
Tôi sẽ nói các đối số dòng lệnh với a,b=sys.argv[1:2]hoặc bất cứ điều gì nhưng sau đó bạn cần một import sys(phải không?)
Alex A.

Trong python3 a,b=input().split()sẽ là một giải pháp 19 byte khác, mặc dù không phải là một cải tiến. Lưu ý rằng điều đó có nghĩa là a và b là các chuỗi và đầu vào được nhập trong một lần được phân tách bằng khoảng trắng.
Matty

Không chắc chắn nếu nó giúp, nhưng trong một số ngôn ngữ, bạn có thể sử dụng một vectơ để có được hai số, thay vì 2 biến. Đối với hai biến tùy ý, một container phức tạp hơn có thể được sử dụng.
Dennis Jaheruddin

a,b=input()trong Py2
Oliver Ni

Câu trả lời:


11

Nếu nhắc người dùng không quan trọng, thì điều này ngắn hơn một chút so evalvới 3 hoặc nhiều hơn:

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

Nó cũng ngắn hơn ngay cả khi lời nhắc không ổn:

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

Đáng buồn thay, ý tưởng của xnor không lưu bất cứ thứ gì cho 2 đầu vào vì nó vẫn dài hơn (19 byte). Tuy nhiên nếu bạn có một số chuỗi (hoặc lặp lại thích hợp) với độ dài phù hợp đã có (vì ma thuật?) Thì nó có thể ngắn hơn.

xnor đã tìm thấy một ví dụ về chuỗi ma thuật cho 3 đầu vào chỉ trong Python 2:

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

Điều này cũng đòi hỏi rằng các lời nhắc không quan trọng, mặc dù.

Thủ thuật này thực sự giúp tiết kiệm byte cho số lượng lớn đầu vào bằng cách sử dụng 1eXký hiệu (nhận x + 3 đầu vào):

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

Giải trình:

mapHàm Python thực hiện chức năng mà nó được truyền cho từng phần tử của iterable cũng được truyền cho nó và trả về danh sách (hoặc đối tượng bản đồ) có chứa kết quả của các cuộc gọi này. Ví dụ đầu tiên, bản đồ có thể được phân tách thành:

[input(1), input(1), input(1)]

2
Làm map(input,'xxx')là có độ dài bằng nhau cho 3 vars, tốt hơn cho 2 và tệ hơn cho 4+.
xnor

3
Nếu, trong một số trường hợp, bạn cần lấy chính xác 22 đầu vào, map(input,`id`)ngắn hơn :-). Tương tự, map(input,`.1`)cho 19 đầu vào.
xnor

3
Trên thực tế, a,b,c=map(input,`.5`)không lưu một char cho 3 đầu vào, vì .5được biểu diễn dưới dạng 0.5.
xnor

Vâng, đó là tốt. Thủ thuật tuyệt vời!
DJMcMayhem

6

Đối với 3 đầu vào trở lên, đây là ngắn hơn:

a,b,c=eval("input(),"*3)

4

Lưu ý rằng trừ khi câu hỏi chỉ định loại đầu vào hoặc yêu cầu một chương trình hoàn chỉnh, bạn có thể lấy đầu vào làm đối số chức năng , loại bỏ nhu cầu về input() . Trong trường hợp đây không phải là một lựa chọn, những điều sau đây có thể giúp ích trong một số trường hợp nhất định.


Nếu bạn muốn các ký tự đơn trong các biến ab, bạn có thể sử dụng

a,b=input()

Nhập chuỗi 2 ký tự sau đó sẽ dẫn đến ký tự đầu tiên được gán cho avà ký tự thứ hai được gán cho b. (Ít hơn 2 hoặc nhiều hơn 2 ký tự trong chuỗi sẽ báo lỗi.)

Nếu bạn yêu cầu nhiều hơn một ký tự cho mỗi biến thì phương pháp này sẽ không hoạt động. Điều này vẫn có thể được sử dụng để nhập 2 số có một chữ số dưới dạng chuỗi. Nếu các số ngoài 9 được yêu cầu thì toàn bộ các ký tự đầu vào tiềm năng có thể được hiểu là các số.

Lưu ý rằng điều này cũng hoạt động cho hơn 2 biến:

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

Điều này hoạt động vì trong Python một chuỗi là một chuỗi các ký tự và có thể được sử dụng ở bất cứ nơi nào một chuỗi được mong đợi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.