Create a dictionary by zipping together two lists of uneven length [duplicate]












17















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'}









share|improve this question









New contributor




Mat is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











marked as duplicate by Roddy of the Frozen Peas, Andrew Savinykh, Azat Ibrakov, coldspeed list
Users with the  list badge can single-handedly close list questions as duplicates and reopen them as needed.

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();
}
);
});
});
yesterday


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
    yesterday










  • Nope, that's a dupe.
    – coldspeed
    yesterday
















17















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'}









share|improve this question









New contributor




Mat is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











marked as duplicate by Roddy of the Frozen Peas, Andrew Savinykh, Azat Ibrakov, coldspeed list
Users with the  list badge can single-handedly close list questions as duplicates and reopen them as needed.

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();
}
);
});
});
yesterday


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
    yesterday










  • Nope, that's a dupe.
    – coldspeed
    yesterday














17












17








17


0






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'}









share|improve this question









New contributor




Mat is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.












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






share|improve this question









New contributor




Mat is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




Mat is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited 2 days ago









coldspeed

122k21122206




122k21122206






New contributor




Mat is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked 2 days ago









MatMat

1005




1005




New contributor




Mat is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





Mat is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






Mat is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.




marked as duplicate by Roddy of the Frozen Peas, Andrew Savinykh, Azat Ibrakov, coldspeed list
Users with the  list badge can single-handedly close list questions as duplicates and reopen them as needed.

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();
}
);
});
});
yesterday


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 list
Users with the  list badge can single-handedly close list questions as duplicates and reopen them as needed.

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();
}
);
});
});
yesterday


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
    yesterday










  • Nope, that's a dupe.
    – coldspeed
    yesterday














  • 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
    yesterday










  • Nope, that's a dupe.
    – coldspeed
    yesterday








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
yesterday




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
yesterday












Nope, that's a dupe.
– coldspeed
yesterday




Nope, that's a dupe.
– coldspeed
yesterday












5 Answers
5






active

oldest

votes


















24














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'}





share|improve this answer































    22














    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)





    share|improve this answer





























      13














      cycle is fine, but I shall add this modulo based approach:



      {L1[i]: L2[i % len(L2)] for i in range(len(L1))]}





      share|improve this answer





























        7














        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.






        share|improve this answer































          3














          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'}





          share|improve this answer





















          • Isn't that already here? stackoverflow.com/a/54095907/4909087 and also in another answer.
            – coldspeed
            yesterday




















          5 Answers
          5






          active

          oldest

          votes








          5 Answers
          5






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          24














          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'}





          share|improve this answer




























            24














            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'}





            share|improve this answer


























              24












              24








              24






              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'}





              share|improve this answer














              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'}






              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited 2 days ago

























              answered 2 days ago









              coldspeedcoldspeed

              122k21122206




              122k21122206

























                  22














                  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)





                  share|improve this answer


























                    22














                    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)





                    share|improve this answer
























                      22












                      22








                      22






                      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)





                      share|improve this answer












                      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)






                      share|improve this answer












                      share|improve this answer



                      share|improve this answer










                      answered 2 days ago









                      Daniel MesejoDaniel Mesejo

                      15.1k21029




                      15.1k21029























                          13














                          cycle is fine, but I shall add this modulo based approach:



                          {L1[i]: L2[i % len(L2)] for i in range(len(L1))]}





                          share|improve this answer


























                            13














                            cycle is fine, but I shall add this modulo based approach:



                            {L1[i]: L2[i % len(L2)] for i in range(len(L1))]}





                            share|improve this answer
























                              13












                              13








                              13






                              cycle is fine, but I shall add this modulo based approach:



                              {L1[i]: L2[i % len(L2)] for i in range(len(L1))]}





                              share|improve this answer












                              cycle is fine, but I shall add this modulo based approach:



                              {L1[i]: L2[i % len(L2)] for i in range(len(L1))]}






                              share|improve this answer












                              share|improve this answer



                              share|improve this answer










                              answered 2 days ago









                              schwobasegglschwobaseggl

                              36.9k32442




                              36.9k32442























                                  7














                                  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.






                                  share|improve this answer




























                                    7














                                    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.






                                    share|improve this answer


























                                      7












                                      7








                                      7






                                      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.






                                      share|improve this answer














                                      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.







                                      share|improve this answer














                                      share|improve this answer



                                      share|improve this answer








                                      edited 2 days ago

























                                      answered 2 days ago









                                      RoadRunnerRoadRunner

                                      11k31340




                                      11k31340























                                          3














                                          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'}





                                          share|improve this answer





















                                          • Isn't that already here? stackoverflow.com/a/54095907/4909087 and also in another answer.
                                            – coldspeed
                                            yesterday


















                                          3














                                          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'}





                                          share|improve this answer





















                                          • Isn't that already here? stackoverflow.com/a/54095907/4909087 and also in another answer.
                                            – coldspeed
                                            yesterday
















                                          3












                                          3








                                          3






                                          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'}





                                          share|improve this answer












                                          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'}






                                          share|improve this answer












                                          share|improve this answer



                                          share|improve this answer










                                          answered yesterday









                                          iGianiGian

                                          3,5502622




                                          3,5502622












                                          • Isn't that already here? stackoverflow.com/a/54095907/4909087 and also in another answer.
                                            – coldspeed
                                            yesterday




















                                          • Isn't that already here? stackoverflow.com/a/54095907/4909087 and also in another answer.
                                            – coldspeed
                                            yesterday


















                                          Isn't that already here? stackoverflow.com/a/54095907/4909087 and also in another answer.
                                          – coldspeed
                                          yesterday






                                          Isn't that already here? stackoverflow.com/a/54095907/4909087 and also in another answer.
                                          – coldspeed
                                          yesterday





                                          Popular posts from this blog

                                          1300-talet

                                          1300-talet

                                          Display a custom attribute below product name in the front-end Magento 1.9.3.8