通过将长度不等的两个列表压缩在一起来创建字典

时间:2019-01-08 16:20:56

标签: python list dictionary zip

我有两个列出了不同长度的L1和L2。 L1比L2长。我想得到一个字典,其中L1的成员作为键,L2的成员作为值。

一旦L2的所有成员都用完了。我想从L2 [0]重新开始。

L1 = ['A', 'B', 'C', 'D', 'E']    
L2 = ['1', '2', '3']    
D = dict(zip(L1, L2))    
print(D)

按预期,输出是这样的:

{'A': '1', 'B': '2', 'C': '3'}

我要实现的目标如下:

{'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}

5 个答案:

答案 0 :(得分:35)

使用itertools.cycle循环到models/a.rb的开头:

L2

对于您而言,将from itertools import cycle dict(zip(L1, cycle(L2))) # {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'} 与自身连接也可以。

L2

答案 1 :(得分:24)

使用itertools.cycle

NaN

输出

from itertools import cycle

L1 = ['A', 'B', 'C', 'D', 'E']
L2 = ['1', '2', '3']

result = dict(zip(L1, cycle(L2)))

print(result)

作为替代方案,您可以使用enumerate和以{'E': '2', 'B': '2', 'A': '1', 'D': '1', 'C': '3'} 的长度为模的索引L2

L2

答案 2 :(得分:15)

cycle很好,但是我将添加以下基于模的方法:

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

答案 3 :(得分:7)

您还可以使用collections.deque()创建循环FIFO队列:

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

弹出L2中当前最左边的项目,并在将数字添加到字典后将其追加到末尾。

注意collections.deque.popleft()collections.deque.append()都是O(1)运算,因此上面仍然是O(N),因为您需要遍历其中的所有元素L1

答案 4 :(得分:5)

其他选项无依赖项,具有良好的旧for循环:

D = {}
for i, e in enumerate(L1):
  D[e] = L2[i%len(L2)]

D #=> {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}

或者只是:

{ e: L2[i%len(L2)] for i, e in enumerate(L1) }
#=> {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}