我有一定长度的list1和一定长度的list2。假设:
list1 = [32, 345, 76, 54]
list2 = [43, 65, 76, 23, 12, 23, 44]
我需要使list1循环,直到它的长度与list2相同。或者,如果list1更长,我需要将其缩减为list2的长度。对于上面的示例,我正在寻找:
list1 = [32, 345, 76, 54, 32, 345, 76]
不一定要保留list1。它可以是一个新列表,我只需要将list1中的相同值循环回一定次数即可。我该怎么做呢?我是python的新手,但是我找不到任何可行的方法。
答案 0 :(得分:6)
了解精彩的itertools
模块!
from itertools import cycle, islice
result = list(islice(cycle(list1), len(list2)))
如果您只需要对两个列表进行“迭代”,这将变得更加简单:
for x, y in zip(cycle(list1), list2):
print(x, y)
答案 1 :(得分:2)
使用itertools.cycle
:
from itertools import cycle
new_list1 = [element for element, index in zip(cycle(list1), range(len(list2)))]
new_list1
输出:
[32, 345, 76, 54, 32, 345, 76]
答案 2 :(得分:1)
您可以使用纯Python:
list1 = [32, 345, 76, 54]
list2 = [43, 65, 76, 23, 12, 23, 44]
l1, l2 = (len(list1) ,len(list2))
diff = (l2- l1) % l2
times = (l2 - l1) // l2
list1 = list1 * (times+1) + list1[:diff]
print(list1)
结果:
[32, 345, 76, 54, 32, 345, 76]
一种替代方法是:
list1 = [32, 345, 76, 54]
list2 = [43, 65, 76, 23, 12, 23, 44]
times = len(list1) + (len(list2) - len(list1))
list1 = [list1[i%len(list1)] for i in range(times)]
print(list1)
答案 3 :(得分:1)
这里有一个使用itertools.cycle
的更详细的解决方案,其他人已经证明了。用这种方式可能更容易理解。
target = len(list2) # the target length we want to hit
curr = 0 # keep track of the current length of output
out = [] # our output list
inf = cycle(list1) # an infinite generator that yields values
while curr < target:
out.append(next(inf))
curr += 1
print(out)
# [32, 345, 76, 54, 32, 345, 76]