Create a dictionary by zipping together two lists of uneven length [duplicate]
This question already has an answer here:
How to zip two differently sized lists?
6 answers
I have two lists different lengths, L1 and L2. L1 is longer than L2. I would like to get a dictionary with members of L1 as keys and members of L2 as values.
As soon as all the members of L2 are used up. I would like to start over and begin again with L2[0].
L1 = ['A', 'B', 'C', 'D', 'E']
L2 = ['1', '2', '3']
D = dict(zip(L1, L2))
print(D)
As expected, the output is this:
{'A': '1', 'B': '2', 'C': '3'}
What I would like to achieve is the following:
{'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
python list dictionary zip
marked as duplicate by Roddy of the Frozen Peas, Andrew Savinykh, Azat Ibrakov, coldspeed
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Jan 9 at 10:23
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
add a comment |
This question already has an answer here:
How to zip two differently sized lists?
6 answers
I have two lists different lengths, L1 and L2. L1 is longer than L2. I would like to get a dictionary with members of L1 as keys and members of L2 as values.
As soon as all the members of L2 are used up. I would like to start over and begin again with L2[0].
L1 = ['A', 'B', 'C', 'D', 'E']
L2 = ['1', '2', '3']
D = dict(zip(L1, L2))
print(D)
As expected, the output is this:
{'A': '1', 'B': '2', 'C': '3'}
What I would like to achieve is the following:
{'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
python list dictionary zip
marked as duplicate by Roddy of the Frozen Peas, Andrew Savinykh, Azat Ibrakov, coldspeed
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Jan 9 at 10:23
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
2
Curious as to the reason for the close votes. What about this question is too broad? If it is because the OP hasn't offered any solution, then I can understand OP may not have the first clue where to begin. Based on their explanation of the question, it does not seem like they could have googled for "cycle", "circular", or other similar keywords that would have led to a solution.
– coldspeed
Jan 9 at 9:14
Nope, that's a dupe.
– coldspeed
Jan 9 at 10:23
add a comment |
This question already has an answer here:
How to zip two differently sized lists?
6 answers
I have two lists different lengths, L1 and L2. L1 is longer than L2. I would like to get a dictionary with members of L1 as keys and members of L2 as values.
As soon as all the members of L2 are used up. I would like to start over and begin again with L2[0].
L1 = ['A', 'B', 'C', 'D', 'E']
L2 = ['1', '2', '3']
D = dict(zip(L1, L2))
print(D)
As expected, the output is this:
{'A': '1', 'B': '2', 'C': '3'}
What I would like to achieve is the following:
{'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
python list dictionary zip
This question already has an answer here:
How to zip two differently sized lists?
6 answers
I have two lists different lengths, L1 and L2. L1 is longer than L2. I would like to get a dictionary with members of L1 as keys and members of L2 as values.
As soon as all the members of L2 are used up. I would like to start over and begin again with L2[0].
L1 = ['A', 'B', 'C', 'D', 'E']
L2 = ['1', '2', '3']
D = dict(zip(L1, L2))
print(D)
As expected, the output is this:
{'A': '1', 'B': '2', 'C': '3'}
What I would like to achieve is the following:
{'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
This question already has an answer here:
How to zip two differently sized lists?
6 answers
python list dictionary zip
python list dictionary zip
edited Jan 8 at 20:23
coldspeed
124k22125208
124k22125208
asked Jan 8 at 16:20
MatMat
1497
1497
marked as duplicate by Roddy of the Frozen Peas, Andrew Savinykh, Azat Ibrakov, coldspeed
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Jan 9 at 10:23
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
marked as duplicate by Roddy of the Frozen Peas, Andrew Savinykh, Azat Ibrakov, coldspeed
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Jan 9 at 10:23
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
2
Curious as to the reason for the close votes. What about this question is too broad? If it is because the OP hasn't offered any solution, then I can understand OP may not have the first clue where to begin. Based on their explanation of the question, it does not seem like they could have googled for "cycle", "circular", or other similar keywords that would have led to a solution.
– coldspeed
Jan 9 at 9:14
Nope, that's a dupe.
– coldspeed
Jan 9 at 10:23
add a comment |
2
Curious as to the reason for the close votes. What about this question is too broad? If it is because the OP hasn't offered any solution, then I can understand OP may not have the first clue where to begin. Based on their explanation of the question, it does not seem like they could have googled for "cycle", "circular", or other similar keywords that would have led to a solution.
– coldspeed
Jan 9 at 9:14
Nope, that's a dupe.
– coldspeed
Jan 9 at 10:23
2
2
Curious as to the reason for the close votes. What about this question is too broad? If it is because the OP hasn't offered any solution, then I can understand OP may not have the first clue where to begin. Based on their explanation of the question, it does not seem like they could have googled for "cycle", "circular", or other similar keywords that would have led to a solution.
– coldspeed
Jan 9 at 9:14
Curious as to the reason for the close votes. What about this question is too broad? If it is because the OP hasn't offered any solution, then I can understand OP may not have the first clue where to begin. Based on their explanation of the question, it does not seem like they could have googled for "cycle", "circular", or other similar keywords that would have led to a solution.
– coldspeed
Jan 9 at 9:14
Nope, that's a dupe.
– coldspeed
Jan 9 at 10:23
Nope, that's a dupe.
– coldspeed
Jan 9 at 10:23
add a comment |
5 Answers
5
active
oldest
votes
Use itertools.cycle
to cycle around to the beginning of L2
:
from itertools import cycle
dict(zip(L1, cycle(L2)))
# {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
In your case, concatenating L2
with itself also works.
# dict(zip(L1, L2 * 2))
dict(zip(L1, L2 + L2))
# {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
add a comment |
Use itertools.cycle:
from itertools import cycle
L1 = ['A', 'B', 'C', 'D', 'E']
L2 = ['1', '2', '3']
result = dict(zip(L1, cycle(L2)))
print(result)
Output
{'E': '2', 'B': '2', 'A': '1', 'D': '1', 'C': '3'}
As an alternative you could use enumerate and index L2
modulo the length of L2
:
result = {v: L2[i % len(L2)] for i, v in enumerate(L1)}
print(result)
add a comment |
cycle
is fine, but I shall add this modulo based approach:
{L1[i]: L2[i % len(L2)] for i in range(len(L1))]}
add a comment |
You can also use a collections.deque()
to create an circular FIFO queue:
from collections import deque
L1 = ['A', 'B', 'C', 'D', 'E']
L2 = deque(['1', '2', '3'])
result = {}
for letter in L1:
number = L2.popleft()
result[letter] = number
L2.append(number)
print(result)
# {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
Which pops the left most item currently in L2
and appends it to the end once the number is added to the dictionary.
Note: Both collections.deque.popleft()
and collections.deque.append()
are O(1) operations, so the above is still O(N), since you need to traverse all the elements in L1
.
add a comment |
Other option without dependencies with good old for
loop:
D = {}
for i, e in enumerate(L1):
D[e] = L2[i%len(L2)]
D #=> {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
Or just:
{ e: L2[i%len(L2)] for i, e in enumerate(L1) }
#=> {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
Isn't that already here? stackoverflow.com/a/54095907/4909087 and also in another answer.
– coldspeed
Jan 9 at 9:53
add a comment |
5 Answers
5
active
oldest
votes
5 Answers
5
active
oldest
votes
active
oldest
votes
active
oldest
votes
Use itertools.cycle
to cycle around to the beginning of L2
:
from itertools import cycle
dict(zip(L1, cycle(L2)))
# {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
In your case, concatenating L2
with itself also works.
# dict(zip(L1, L2 * 2))
dict(zip(L1, L2 + L2))
# {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
add a comment |
Use itertools.cycle
to cycle around to the beginning of L2
:
from itertools import cycle
dict(zip(L1, cycle(L2)))
# {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
In your case, concatenating L2
with itself also works.
# dict(zip(L1, L2 * 2))
dict(zip(L1, L2 + L2))
# {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
add a comment |
Use itertools.cycle
to cycle around to the beginning of L2
:
from itertools import cycle
dict(zip(L1, cycle(L2)))
# {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
In your case, concatenating L2
with itself also works.
# dict(zip(L1, L2 * 2))
dict(zip(L1, L2 + L2))
# {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
Use itertools.cycle
to cycle around to the beginning of L2
:
from itertools import cycle
dict(zip(L1, cycle(L2)))
# {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
In your case, concatenating L2
with itself also works.
# dict(zip(L1, L2 * 2))
dict(zip(L1, L2 + L2))
# {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
edited Jan 8 at 21:20
answered Jan 8 at 16:22
coldspeedcoldspeed
124k22125208
124k22125208
add a comment |
add a comment |
Use itertools.cycle:
from itertools import cycle
L1 = ['A', 'B', 'C', 'D', 'E']
L2 = ['1', '2', '3']
result = dict(zip(L1, cycle(L2)))
print(result)
Output
{'E': '2', 'B': '2', 'A': '1', 'D': '1', 'C': '3'}
As an alternative you could use enumerate and index L2
modulo the length of L2
:
result = {v: L2[i % len(L2)] for i, v in enumerate(L1)}
print(result)
add a comment |
Use itertools.cycle:
from itertools import cycle
L1 = ['A', 'B', 'C', 'D', 'E']
L2 = ['1', '2', '3']
result = dict(zip(L1, cycle(L2)))
print(result)
Output
{'E': '2', 'B': '2', 'A': '1', 'D': '1', 'C': '3'}
As an alternative you could use enumerate and index L2
modulo the length of L2
:
result = {v: L2[i % len(L2)] for i, v in enumerate(L1)}
print(result)
add a comment |
Use itertools.cycle:
from itertools import cycle
L1 = ['A', 'B', 'C', 'D', 'E']
L2 = ['1', '2', '3']
result = dict(zip(L1, cycle(L2)))
print(result)
Output
{'E': '2', 'B': '2', 'A': '1', 'D': '1', 'C': '3'}
As an alternative you could use enumerate and index L2
modulo the length of L2
:
result = {v: L2[i % len(L2)] for i, v in enumerate(L1)}
print(result)
Use itertools.cycle:
from itertools import cycle
L1 = ['A', 'B', 'C', 'D', 'E']
L2 = ['1', '2', '3']
result = dict(zip(L1, cycle(L2)))
print(result)
Output
{'E': '2', 'B': '2', 'A': '1', 'D': '1', 'C': '3'}
As an alternative you could use enumerate and index L2
modulo the length of L2
:
result = {v: L2[i % len(L2)] for i, v in enumerate(L1)}
print(result)
answered Jan 8 at 16:22
Daniel MesejoDaniel Mesejo
15.8k21030
15.8k21030
add a comment |
add a comment |
cycle
is fine, but I shall add this modulo based approach:
{L1[i]: L2[i % len(L2)] for i in range(len(L1))]}
add a comment |
cycle
is fine, but I shall add this modulo based approach:
{L1[i]: L2[i % len(L2)] for i in range(len(L1))]}
add a comment |
cycle
is fine, but I shall add this modulo based approach:
{L1[i]: L2[i % len(L2)] for i in range(len(L1))]}
cycle
is fine, but I shall add this modulo based approach:
{L1[i]: L2[i % len(L2)] for i in range(len(L1))]}
answered Jan 8 at 16:29
schwobasegglschwobaseggl
37k32442
37k32442
add a comment |
add a comment |
You can also use a collections.deque()
to create an circular FIFO queue:
from collections import deque
L1 = ['A', 'B', 'C', 'D', 'E']
L2 = deque(['1', '2', '3'])
result = {}
for letter in L1:
number = L2.popleft()
result[letter] = number
L2.append(number)
print(result)
# {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
Which pops the left most item currently in L2
and appends it to the end once the number is added to the dictionary.
Note: Both collections.deque.popleft()
and collections.deque.append()
are O(1) operations, so the above is still O(N), since you need to traverse all the elements in L1
.
add a comment |
You can also use a collections.deque()
to create an circular FIFO queue:
from collections import deque
L1 = ['A', 'B', 'C', 'D', 'E']
L2 = deque(['1', '2', '3'])
result = {}
for letter in L1:
number = L2.popleft()
result[letter] = number
L2.append(number)
print(result)
# {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
Which pops the left most item currently in L2
and appends it to the end once the number is added to the dictionary.
Note: Both collections.deque.popleft()
and collections.deque.append()
are O(1) operations, so the above is still O(N), since you need to traverse all the elements in L1
.
add a comment |
You can also use a collections.deque()
to create an circular FIFO queue:
from collections import deque
L1 = ['A', 'B', 'C', 'D', 'E']
L2 = deque(['1', '2', '3'])
result = {}
for letter in L1:
number = L2.popleft()
result[letter] = number
L2.append(number)
print(result)
# {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
Which pops the left most item currently in L2
and appends it to the end once the number is added to the dictionary.
Note: Both collections.deque.popleft()
and collections.deque.append()
are O(1) operations, so the above is still O(N), since you need to traverse all the elements in L1
.
You can also use a collections.deque()
to create an circular FIFO queue:
from collections import deque
L1 = ['A', 'B', 'C', 'D', 'E']
L2 = deque(['1', '2', '3'])
result = {}
for letter in L1:
number = L2.popleft()
result[letter] = number
L2.append(number)
print(result)
# {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
Which pops the left most item currently in L2
and appends it to the end once the number is added to the dictionary.
Note: Both collections.deque.popleft()
and collections.deque.append()
are O(1) operations, so the above is still O(N), since you need to traverse all the elements in L1
.
edited Jan 8 at 17:05
answered Jan 8 at 16:35
RoadRunnerRoadRunner
11.2k31340
11.2k31340
add a comment |
add a comment |
Other option without dependencies with good old for
loop:
D = {}
for i, e in enumerate(L1):
D[e] = L2[i%len(L2)]
D #=> {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
Or just:
{ e: L2[i%len(L2)] for i, e in enumerate(L1) }
#=> {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
Isn't that already here? stackoverflow.com/a/54095907/4909087 and also in another answer.
– coldspeed
Jan 9 at 9:53
add a comment |
Other option without dependencies with good old for
loop:
D = {}
for i, e in enumerate(L1):
D[e] = L2[i%len(L2)]
D #=> {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
Or just:
{ e: L2[i%len(L2)] for i, e in enumerate(L1) }
#=> {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
Isn't that already here? stackoverflow.com/a/54095907/4909087 and also in another answer.
– coldspeed
Jan 9 at 9:53
add a comment |
Other option without dependencies with good old for
loop:
D = {}
for i, e in enumerate(L1):
D[e] = L2[i%len(L2)]
D #=> {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
Or just:
{ e: L2[i%len(L2)] for i, e in enumerate(L1) }
#=> {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
Other option without dependencies with good old for
loop:
D = {}
for i, e in enumerate(L1):
D[e] = L2[i%len(L2)]
D #=> {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
Or just:
{ e: L2[i%len(L2)] for i, e in enumerate(L1) }
#=> {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}
answered Jan 9 at 9:05
iGianiGian
3,6252622
3,6252622
Isn't that already here? stackoverflow.com/a/54095907/4909087 and also in another answer.
– coldspeed
Jan 9 at 9:53
add a comment |
Isn't that already here? stackoverflow.com/a/54095907/4909087 and also in another answer.
– coldspeed
Jan 9 at 9:53
Isn't that already here? stackoverflow.com/a/54095907/4909087 and also in another answer.
– coldspeed
Jan 9 at 9:53
Isn't that already here? stackoverflow.com/a/54095907/4909087 and also in another answer.
– coldspeed
Jan 9 at 9:53
add a comment |
2
Curious as to the reason for the close votes. What about this question is too broad? If it is because the OP hasn't offered any solution, then I can understand OP may not have the first clue where to begin. Based on their explanation of the question, it does not seem like they could have googled for "cycle", "circular", or other similar keywords that would have led to a solution.
– coldspeed
Jan 9 at 9:14
Nope, that's a dupe.
– coldspeed
Jan 9 at 10:23