This question already has answers here:
How to zip two differently sized lists, repeating the shorter list?
(15 answers)
Closed 26 days ago.
I want to combine two lists in an alternating way in Python.
list1 = ['A']
list2 = [1, 2, 3, 4]
What I've tried:
combination = [x for y in zip(list1, list2) for x in y]
# Output:
['A', 1]
# Expected output:
['A', 1, 'A', 2, 'A', 3, 'A', 4]
How can I combine these two lists and get the expected output? (Preferably list comprehension)
One way is to use itertools cycle function:
from itertools import cycle
list1 = ['A']
list2 = [1, 2, 3, 4]
combination = [x for y in zip(cycle(list1), list2) for x in y]
This also works with
list1 = ['A', 'B']
list1*len(list2) will repeat the first list elements as many times as the length of the second list.
combination = [x for y in zip(list1*len(list2), list2) for x in y]
['A', 1, 'A', 2, 'A', 3, 'A', 4]
This question already has answers here:
How do I iterate through two lists in parallel?
(8 answers)
Closed 4 months ago.
I want to zip two lists. For example:
a = ['a', 'b', 'c', 'd']
b = [0, 2, 1, 4]
And I have to left in the list only objects that don't match with 0.
So for lists a and b I have to get list c:
c = ['b', 'c', 'd']
How can I do this with python? I tried using loop, but it works too long. Maybe I have to use zip() method, but I don't know exactly how to use it :(
You could combine zip with list comprehension as follows:
a = ['a', 'b', 'c', 'd']
b = [0, 2, 1, 4]
c = [x for (x,y) in list(zip(a,b)) if y != 0]
outputs: ['b', 'c', 'd']
It seems a perfect job for compress from itertools
from itertools import compress
a = ['a', 'b', 'c', 'd']
b = [0, 2, 1, 4]
print(*compress(a, b))
c = [x for x, y in zip(a, b) if y != 0]
This will work fine when both lists have the same length. If list a was longer and you'd want the extra elements out too, you could use this version:
from itertools import zip_longest
c = [x for x, y in zip_longest(a, b) if y != 0 and x is not None]
This question already has answers here:
Why do these list operations (methods: clear / extend / reverse / append / sort / remove) return None, rather than the resulting list?
(6 answers)
How do I iterate through two lists in parallel?
(8 answers)
How do I concatenate two lists in Python?
(31 answers)
Closed 6 months ago.
I'm trying to extend two lists of lists in python, so that item 1 of the first list of lists extends with item 1 of the second list of lists, and so forth.
I'm new to this and self-taught, so could be missing something very simple, but I can't find an answer anywhere.
This is what I feel the code should be, but obviously not working.
list1[x].extend(list2[x]) for x in list1
What I'm trying to achieve is this:
list1 = [[1,2,3],[4,5,6],[7,8,9]]
list2 = [[a,b,c],[d,e,f],[g,h,i]]
output = [[1,2,3,a,b,c],[4,5,6,d,e,f],[7,8,9,g,h,i]]
Any ideas?
You can use zip:
list1 = [[1,2,3],[4,5,6],[7,8,9]]
list2 = [['a','b','c'], ['d','e','f'], ['g','h','i']]
output = [sub1 + sub2 for sub1, sub2 in zip(list1, list2)]
print(output)
# [[1, 2, 3, 'a', 'b', 'c'], [4, 5, 6, 'd', 'e', 'f'], [7, 8, 9, 'g', 'h', 'i']]
Use zip() to loop over the two lists in parallel. Then use extend() to append the sublist from list2 to the corresponding sublist in list1.
for l1, l2 in zip(list1, list2):
l1.extend(l2)
print(list1)
list1[x].extend(list2[x]) does achieve the result you want for one pair of lists, if list1[x] is [1, 2, 3] and list2[x] is [a, b, c], for example.
That means x has to be an index:
x = 0
list1[x].extend(list2[x])
# now the first list in `list1` looks like your desired output
To do that for every pair of lists, loop over all possible indexes x – range(upper) is the range of integers from 0 (inclusive) to upper (exclusive):
for x in range(len(list1)):
list1[x].extend(list2[x])
# now `list1` contains your output
To produce a new list of lists instead of altering the lists in list1, you can concatenate lists with the + operator instead:
>>> [1, 2, 3] + ['a', 'b', 'c']
[1, 2, 3, 'a', 'b', 'c']
output = []
for x in range(len(list1)):
output.append(list1[x] + list2[x])
And finally, the idiomatic Python for this that you’ll get around to someday is:
output = [x1 + x2 for x1, x2 in zip(list1, list2)]
I have simply used list comprehension with list addition, while zipping the correlated lists together
list1 = [[1,2,3],[4,5,6],[7,8,9]]
list2 = [['a','b','c'], ['d','e','f'], ['g','h','i']]
list3 = [l1+l2 for l1, l2 in zip(list1, list2)]
print(list3)
[[1, 2, 3, 'a', 'b', 'c'], [4, 5, 6, 'd', 'e', 'f'], [7, 8, 9, 'g', 'h', 'i']]
This question already has answers here:
Transpose list of lists
(14 answers)
Closed 1 year ago.
I have 3 lists examples below, I want to match each one and create new lists
l1 = [a,b,c]
l2= [1,2,3]
l3=[7,8,9]
How do I create 3 new lists with expected output:
l1 = [a,1,7]
l2= [b,2,8]
l3=[c,3,9]
Thanks!
Use zip or a comprehension:
# Create a list of lists
ls = [l1, l2, l3]
ls = list(zip(*ls)) # output: a list of tuples
# OR
ls = [l for l in zip(*ls)] # output: a list of lists
Output:
>>> ls[0]
['a', 1, 7]
>>> ls[1]
['b', 2, 8]
>>> ls[2]
['c', 3, 9]
This question already has answers here:
Combining 2 lists in python
(2 answers)
Closed 8 years ago.
If I have 2 lists:
list1 = ["X","Y","Z"]
list2 = [1,2,3]
How can I combine them to make a another list:
list3 = [[1,"X"],[2,"Y"],[3,"Z"]]
Thanks in advance!
Just use zip to get tuples of values at corresponding indices in the two lists, and then cast each tuple to a list. So:
[list(t) for t in zip(list1, list2)]
is all you need to do.
Demo:
>>> list1 = ["X", "Y", "Z"]
>>> list2 = [1, 2, 3]
>>> list3 = [list(t) for t in zip(list1, list2)]
>>> list3
[[1, 'X'], [2, 'Y'], [3, 'Z']]