如何将列表复制到一定长度?

时间:2019-03-24 23:19:47

标签: python

我有一定长度的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的新手,但是我找不到任何可行的方法。

4 个答案:

答案 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]