Ajay H
Ajay H

Reputation: 824

python - Convert Single integer into a list

Say I have the following lists:

a = 1
b = [2,3]
c = [4,5,6]

I want to concatenate them such that I get the following:

[1,2,3,4,5,6]

I tried the usual + operator:

>>> a+b+c
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'list'

This is because of the a term. It is just an integer. So I convert everything to a list:

>>> [a]+[b]+[c]
[1, [2, 3], [4, 5, 6]]

Not quite what I'm looking for.

I also tried all the options in this answer, but I get the same int error mentioned above.

>>> l = [a]+[b]+[c]
>>> flat_list = [item for sublist in l for item in sublist]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <listcomp>
TypeError: 'int' object is not iterable

It should be simple enough, but nothing works with that term a. Is there any way to do this efficiently? It doens't necessarily have to be pythonic.

Upvotes: 13

Views: 20063

Answers (3)

Subham
Subham

Reputation: 411

Accepted answer is the best way. Adding another variation. Explanation in comments as well.

from collections.abc import Iterable


a = "fun" 
b = [2,3]
c = [4,5,6]


def flatten(lst):
    for item in lst:
        if isinstance(item,Iterable) and not isinstance(item,str): # checking if Iterable and taking care of strings as well
            yield from flatten(item)
        else:
            yield item

# test case:

res = []
res.extend([a]+[b]+[c]) # casting them into lists,  [a]+[b]+[c] [1, [2, 3], [4, 5, 6]]
print(list(flatten(res)))

Produces

['fun', 2, 3, 4, 5, 6]

[Program finished] 

Upvotes: 1

Ajax1234
Ajax1234

Reputation: 71451

You can use itertools:

from itertools import chain

a = 1
b = [2,3]
c = [4,5,6]
final_list = list(chain.from_iterable([[a], b, c]))

Output:

[1, 2, 3, 4, 5, 6]

However, if you do not know the contents of a, b, and c ahead of time, you can try this:

new_list = [[i] if not isinstance(i, list) else i for i in [a, b, c]]
final_list = list(chain.from_iterable(new_list))

Upvotes: 3

Barmar
Barmar

Reputation: 780808

There's nothing that will automatically treat an int as if it's a list of one int. You need to check whether the value is a list or not:

(a if type(a) is list else [a]) + (b if type(b) is list else [b]) + (c if type(c) is list else [c])

If you have to do this often you might want to write a function:

def as_list(x):
    if type(x) is list:
        return x
    else:
        return [x]

Then you can write:

as_list(a) + as_list(b) + as_list(c)

Upvotes: 14

Related Questions