合并两个列表(偶/奇元素)

时间:2020-06-17 01:00:25

标签: python numpy

len_array = 10
A = np.zeros( len_array )
B = np.zeros( len_array )

A = np.arange(1, 5, 0.5)
B = np.arange(11, 15, 0.5)
A = A.tolist()
B = B.tolist()

我跟随另一个执行类似任务的post,但是它只是将B中的元素插入到A中。此方法未生成新列表C。

for i,v in enumerate(B):
    A.insert(2*i+1,v) 

如何创建一个基于A和B的偶数/奇数元素合并的新列表C?

谢谢。

4 个答案:

答案 0 :(得分:1)

我建议您使用numpy而不是将其转换为列表(即A = A.tolist()B = B.tolist()之前的列表):

C = np.dstack((A,B)).flatten()

但是,如果您坚持使用列表,则可以创建一个列表并向其中添加插入列表:

C = [None]*(len(A)+len(B))
C[::2] = A
C[1::2] = B

它们都创建类似的输出(一个numpy数组和另一个列表)。您的示例中的输出:

[1.0, 11.0, 1.5, 11.5, 2.0, 12.0, 2.5, 12.5, 3.0, 13.0, 3.5, 13.5, 4.0, 14.0, 4.5, 14.5]

答案 1 :(得分:1)

In [194]: A = np.arange(1, 5, 0.5) 
     ...: B = np.arange(11, 15, 0.5)                                                                            

A派生的列表是副本。对C进行就地更改不会影响A

In [196]: C = A.tolist()                                                                                        
In [197]: for i,v in enumerate(B): 
     ...:     C.insert(2*i+1,v) 
     ...:                                                                                                       
In [198]: A                                                                                                     
Out[198]: array([1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5])
In [199]: B                                                                                                     
Out[199]: array([11. , 11.5, 12. , 12.5, 13. , 13.5, 14. , 14.5])
In [200]: C                                                                                                     
Out[200]: 
[1.0,
 11.0,
 1.5,
 11.5,
 2.0,
 12.0,
 2.5,
 12.5,
 3.0,
 13.0,
 3.5,
 13.5,
 4.0,
 14.0,
 4.5,
 14.5]

一种数组方法:

In [201]: np.vstack((A,B))                                                                                      
Out[201]: 
array([[ 1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5],
       [11. , 11.5, 12. , 12.5, 13. , 13.5, 14. , 14.5]])
In [202]: np.vstack((A,B)).ravel(order='F')                                                                     
Out[202]: 
array([ 1. , 11. ,  1.5, 11.5,  2. , 12. ,  2.5, 12.5,  3. , 13. ,  3.5,
       13.5,  4. , 14. ,  4.5, 14.5])

或者我们可以将数组堆叠为列,然后进行普通的C排序。

===

另一种列表方式-使用zip来创建列表列表,并使用itertools.chain来使其变平:

In [203]: import itertools                                                                                      
In [204]: [(i,j) for i,j in zip(A,B)]                                                                           
Out[204]: 
[(1.0, 11.0),
 (1.5, 11.5),
 (2.0, 12.0),
 (2.5, 12.5),
 (3.0, 13.0),
 (3.5, 13.5),
 (4.0, 14.0),
 (4.5, 14.5)]
In [205]: list(itertools.chain(*[(i,j) for i,j in zip(A,B)]))                                                   
Out[205]: 
[1.0,
 11.0,
 1.5,
 11.5,
 2.0,
 12.0,
 2.5,
 12.5,
 3.0,
 13.0,
 3.5,
 13.5,
 4.0,
 14.0,
 4.5,
 14.5]

答案 2 :(得分:0)

结合使用builtin zip()和列表理解。

C = [item for sublist in zip(A, B) for item in sublist]

这是此代码(某种程度上)的详细描述:

C = []
for sublist in zip(A, B):
    for item in sublist:
         C.append(item)

或更短:

C = []
for sublist in zip(A, B):
    C.extend(sublist)

请注意,最短列表结束时,将停止使用zip(A, B)。如果您需要其他行为,请使用zip_longest()

答案 3 :(得分:0)

OP:如何创建一个基于A和B的偶数/奇数元素合并的新列表C?

假设您有两个混合有奇/偶元素的列表,则可以将奇/偶元素分开并将它们存储在单独的列表中,然后使用zip()对其进行迭代:

A = [1,2,3,41,10,5,3,100]
B = [10,21,22,4,18,1,2,9]

odd_lst = []
even_lst = []


def is_even_odd(item):
    if int(item) % 2 == 0:
        even_lst.append(item)
    else:
        odd_lst.append(item)

for a_item, b_item in zip(A,B):
    is_even_odd(a_item)
    is_even_odd(b_item)


print([item for tup in zip(odd_lst, even_lst) for item in tup])

输出:

[1, 10, 21, 2, 3, 22, 41, 4, 5, 10, 1, 18, 3, 2, 9, 100]  # new list with odd,even elements sequence
相关问题