给出两个等长列表:
a = [1,2,3,4,5,6,7,8,9]
b = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
无论如何,是否有一次将它们组合在一起,一次是每个元素的前3个(或更常见的,对于较大的列表,则是前n个),所以我在下面得到一个列表输出:
c = [1,2,3,a,b,c,4,5,6,d,e,f,7,8,9,f,h,i]
我已经看到解决方案,该解决方案显示了如何从每个列表中一次处理1个元素,但是无法将其转换为n个元素。
答案 0 :(得分:3)
>>> list(itertools.chain.from_iterable(
a[p:p+n] + b[p:p+n] for p in range(0, len(a), n)))
[1, 2, 3, 'a', 'b', 'c', 4, 5, 6, 'd', 'e', 'f', 7, 8, 9, 'g', 'h', 'i']
答案 1 :(得分:1)
您可以使用简单的for
循环和slices
(其中n
-数组长度:
result = []
for j in range(0, len(a), n):
result += a[j:j+n] + b[j:j+n]
print(result)
答案 2 :(得分:1)
这是使用itertools grouper
配方的一种功能高效(快速)的方式,没有任何突变。另一个优点是它可以与任意数量的列表一起使用,而不仅仅是两个。
from itertools import zip_longest, chain
a = [1,2,3,4,5,6,7,8,9]
b = 'a,b,c,d,e,f,g,h,i'.split(',')
def grouper(iterable, n, fillvalue = None):
"""Collect data into fixed-length chunks or blocks
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
"""
args = [iter(iterable)]*n
return zip_longest(*args, fillvalue=fillvalue)
def multi_round_robin(*iterables, n, fillvalue = None):
""" Collect data from multiple iterables in groups
# multi_round_robin('ABCD', 'EFGH', n=2) --> A B E F C D G H
"""
for tups in zip(*(grouper(itr, n, fillvalue) for itr in iterables)):
return chain.from_iterable(tups)
list(multi_round_robin(a, b, n=3))
# --> [1, 2, 3, 'a', 'b', 'c', 4, 5, 6, 'd', 'e', 'f', 7, 8, 9, 'g', 'h', 'i']
答案 3 :(得分:1)
使用列表切片
例如:
a = [1,2,3,4,5,6,7,8,9]
b = ['a','b','c','d','e','f','g','h','i']
res = []
for i in range(0, len(a), 3):
res.extend(a[i:i+3] + b[i:i+3])
print(res)
输出:
[1, 2, 3, 'a', 'b', 'c', 4, 5, 6, 'd', 'e', 'f', 7, 8, 9, 'g', 'h', 'i']
答案 4 :(得分:1)
尝试列表理解:
lst = [a[i:i+3] + b[i:i+3] for i in range(0, len(a), 3)]
result = [i for s in lst for i in s]
print (result)
答案
[1, 2, 3, 'a', 'b', 'c', 4, 5, 6, 'd', 'e', 'f', 7, 8, 9, 'g', 'h', 'i']
答案 5 :(得分:0)
我会使用如下功能
def create_list(arr1, arr2, n):
c = []
for i in range(len(arr1)//n):
for j in range(3):
c.append(arr1[(i*3)+j])
for j in range(3):
c.append(arr2[(i*3)+j])
return c
这应该为您提供所需的列表。
答案 6 :(得分:0)
您可以轻松地执行一个小功能来执行此操作:
a = [1,2,3,4,5,6,7,8,9]
b = ['a','b','c','d','e','f','g','h','i']
def interleave( listA, listB, interval):
result = []
while len(listB) >= interval and len(listA) >= interval:
[result.append( listA.pop(0) ) for i in range(interval)]
[result.append( listB.pop(0) ) for i in range(interval)]
#Add remainder of lists in order
[result.append( item ) for item in listA]
[result.append( item ) for item in listB]
return result
print( interleave(a, b, 3) )
结果
[1, 2, 3, 'a', 'b', 'c', 4, 5, 6, 'd', 'e', 'f', 7, 8, 9, 'g', 'h', 'i']
答案 7 :(得分:0)
这里是一种方法:
In [14]: a
Out[14]: [1, 2, 3, 4, 5, 6, 7, 8, 9]
In [15]: b
Out[15]: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
In [17]: al = [a[i:i+3] for i in range(0, len(a), 3)]
In [18]: bl = [b[i:i+3] for i in range(0, len(b), 3)]
In [19]: al
Out[19]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
In [20]: bl
Out[20]: [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
In [23]: [k for i in list(zip(al, bl)) for j in i for k in j]
Out[23]: [1, 2, 3, 'a', 'b', 'c', 4, 5, 6, 'd', 'e', 'f', 7, 8, 9, 'g', 'h', 'i']