69

I tried to use input (Py3) /raw_input() (Py2) to get a list of numbers, however with the code

numbers = input()
print(len(numbers))

the input [1,2,3] and 1 2 3 gives a result of 7 and 5 respectively – it seems to interpret the input as if it were a string. Is there any direct way to make a list out of it? Maybe I could use re.findall to extract the integers, but if possible, I would prefer to use a more Pythonic solution.

MisterMiyagi
  • 44,374
  • 10
  • 104
  • 119
Underyx
  • 1,599
  • 1
  • 17
  • 23
  • 1
    "it seems to interpret the input as if it were a string." No "interpretation" happens (unless you count translating keystrokes into bytes and then bytes into text); the input **is** a string. – Karl Knechtel Sep 05 '22 at 17:18

11 Answers11

116

In Python 3.x, use this.

a = [int(x) for x in input().split()]

Example

>>> a = [int(x) for x in input().split()]
3 4 5
>>> a
[3, 4, 5]
>>> 
Amit Joki
  • 58,320
  • 7
  • 77
  • 95
greentec
  • 2,130
  • 1
  • 19
  • 16
  • http://introtopython.org/lists_tuples.html#List-Comprehensions maybe this is helpful. – greentec Feb 28 '17 at 05:31
  • Can this accept different data types other than int? i.e. Can I replace `int(x)` with `string(x)` – Stevoisiak Nov 02 '17 at 15:10
  • @StevenVascellaro Yes although the expression would be str(x) instead of string(x) since str is python's way of saying string – Vikhyat Agarwal Jan 08 '18 at 12:40
  • 7
    @DhirajBarnwal If you want to know what's going on there: `input()` to read input + `split()` to split the input on spaces + `[f(x) for x in iter]` to loop over each of those + `int` to turn each into an int. If you want to know how one can come up with it: it's mostly just figuring out what you want to do and which pieces you need to put together to achieve that. – Bernhard Barker Feb 20 '18 at 21:14
  • 1
    I would have +1 if you had an extra 2 lines of explanation which @Dukeling did in the comments. – Rishav Mar 13 '19 at 04:16
  • @Stevoisiak `x` is already a string (`str`), so no need to convert it :) – wjandrea Aug 10 '23 at 03:06
61

It is much easier to parse a list of numbers separated by spaces rather than trying to parse Python syntax:

Python 3:

s = input()
numbers = list(map(int, s.split()))

Python 2:

s = raw_input()
numbers = map(int, s.split())
Sven Marnach
  • 574,206
  • 118
  • 941
  • 841
  • 2
    After python 2.7 raw_input() was renamed to input(). Stack overflow [answer](http://stackoverflow.com/a/954840/318807) – AJ Dhaliwal Apr 15 '16 at 11:29
  • what if my input is having mixed datatype string and integer then how can i split them and convert to list. input: 'aaa' 3 45 554 'bbb' 34 'ccc' i added the contents seperated by space!! – frp farhan May 06 '17 at 16:25
  • @FarhanPatel That's an unrelated question, so I suggest asking a new question. Start with looping over `s.split()` or `shlex.split(s)` if you want to allow spaces inside quoted strings. – Sven Marnach May 06 '17 at 16:30
  • posting it as a new question, thnx for the encouragement, was scary it might not be marked as duplicate!! http://stackoverflow.com/questions/43822895/how-to-separate-a-mixed-datatype-string-taken-as-input-into-list – frp farhan May 06 '17 at 16:42
9

Using Python-like syntax

The standard library provides ast.literal_eval, which can evaluate certain strings as though they were Python code. This does not create a security risk, but it can still result in crashes and a wide variety of exceptions.

For example: on my machine ast.literal_eval('['*1000 + ']'*1000) will raise MemoryError, even though the input is only two kilobytes of text.

As explained in the documentation:

The string or node provided may only consist of the following Python literal structures: strings, bytes, numbers, tuples, lists, dicts, sets, booleans, None and Ellipsis.

(The documentation is slightly inaccurate. ast.literal_eval also supports addition and subtraction of numbers - but not any other operators - so that it can support complex numbers.)

This is sufficient for reading and parsing a list of integers formatted like Python code (e.g. if the input is [1, 2, 3]. For example:

>>> import ast
>>> ast.literal_eval(input("Give me a list: "))
Give me a list: [1,2,3]
[1, 2, 3]

Do not ever use eval for input that could possibly ever come, in whole or in part, from outside the program. It is a critical security risk that enables the creator of that input to run arbitrary code.

It cannot be properly sandboxed without significant expertise and massive restrictions - at which point it is obviously much easier to just use ast.literal_eval. This is increasingly important in our Web-connected world.

In Python 2.x, raw_input is equivalent to Python 3.x input; 2.x input() is equivalent to eval(raw_input()). Python 2.x thus exposed a critical security risk in its built-in, designed-to-be-beginner-friedly functionality, and did so for many years. It also has not been officially supported since Jan 1, 2020. It is approximately as outdated as Windows 7.

Do not use Python 2.x unless you absolutely have to; if you do, do not use the built-in input.

Using your own syntax

Of course, it is clearly possible to parse the input according to custom rules. For example, if we want to read a list of integers, one simple format is to expect the integer values separated by whitespace.

To interpret that, we need to:

All of those tasks are covered by the common linked duplicates; the resulting code is shown in the top answer here.

Using other syntaxes

Rather than inventing a format for the input, we could expect input in some other existing, standard format - such as JSON, CSV etc. The standard library includes tools to parse those two. However, it's generally not very user-friendly to expect people to type such input by hand at a prompt. Normally this kind of input will be read from a file instead.

Verifying input

ast.literal_eval will also read and parse many things that aren't a list of integers; so subsequent code that expects a list of integers will still need to verify the input.

Aside from that, if the input isn't formatted as expected, generally some kind of exception will be thrown. Generally you will want to check for this, in order to repeat the prompt. Please see Asking the user for input until they give a valid response.

Karl Knechtel
  • 62,466
  • 11
  • 102
  • 153
5

You can use .split()

numbers = raw_input().split(",")
print len(numbers)

This will still give you strings, but it will be a list of strings.

If you need to map them to a type, use list comprehension:

numbers = [int(n, 10) for n in raw_input().split(",")]
print len(numbers)

If you want to be able to enter in any Python type and have it mapped automatically and you trust your users IMPLICITLY then you can use eval

Sean Vieira
  • 155,703
  • 32
  • 311
  • 293
4

Another way could be to use the for-loop for this one. Let's say you want user to input 10 numbers into a list named "memo"

memo=[] 
for i in range (10):
    x=int(input("enter no. \n")) 
    memo.insert(i,x)
    i+=1
print(memo) 
Ayan Khan
  • 49
  • 1
  • 5
  • This takes each number as a separate input, on a separate line. The question implies a single line of input with one call to `input`... – Tomerikoo Apr 08 '21 at 14:07
1

you can pass a string representation of the list to json:

import json

str_list = raw_input("Enter in a list: ")
my_list = json.loads(str_list)

user enters in the list as you would in python: [2, 34, 5.6, 90]

Anthon
  • 69,918
  • 32
  • 186
  • 246
Logan
  • 11
  • 3
0

Answer is trivial. try this.

x=input()

Suppose that [1,3,5,'aA','8as'] are given as the inputs

print len(x)

this gives an answer of 5

print x[3]

this gives 'aA'

Hadi
  • 5,328
  • 11
  • 46
  • 67
0
a=[]
b=int(input())
for i in range(b):
    c=int(input())
    a.append(c)

The above code snippets is easy method to get values from the user.

0

Get a list of number as input from the user.

This can be done by using list in python.

L=list(map(int,input(),split()))

Here L indicates list, map is used to map input with the position, int specifies the datatype of the user input which is in integer datatype, and split() is used to split the number based on space.

.

enter image description here

Integraty_dev
  • 500
  • 3
  • 18
0

I think if you do it without the split() as mentioned in the first answer. It will work for all the values without spaces. So you don't have to give spaces as in the first answer which is more convenient I guess.

a = [int(x) for x in input()]
a

Here is my ouput:

11111
[1, 1, 1, 1, 1]
Asim Khan
  • 21
  • 3
  • What if I want to pass `1, 11, 111`or maybe `11, 1, 111`? In your program they will all just be `1, 1, 1, 1, 1, 1`... Bottom line, this only works for ***single digit*** numbers which is pretty restrictive... – Tomerikoo Apr 08 '21 at 14:09
-1

try this one ,

n=int(raw_input("Enter length of the list"))
l1=[]
for i in range(n):
    a=raw_input()
    if(a.isdigit()):
        l1.insert(i,float(a)) #statement1
    else:
        l1.insert(i,a)        #statement2

If the element of the list is just a number the statement 1 will get executed and if it is a string then statement 2 will be executed. In the end you will have an list l1 as you needed.

Tunaki
  • 132,869
  • 46
  • 340
  • 423
xarvier
  • 1
  • 1