我有两个列出了不同长度的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'}
答案 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)
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'}