组合2个列表,每次n个元素

时间:2018-08-01 15:15:18

标签: python list elements

给出两个等长列表:

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个元素。

8 个答案:

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