【问题标题】:merge two lists (even/odd elements)合并两个列表(偶数/奇数元素)
【发布时间】:2020-06-17 01:00:25
【问题描述】:
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) 

如何创建一个新的列表 C,根据 A 和 B 的偶数/奇数元素合并它们?

谢谢。

【问题讨论】:

  • 你能显示你的预期输出吗?您正在调用tolist,但您是否打算使用 numpy 数组或 Python 列表?我不明白最初对np.zeros 的调用是做什么的,因为这些变量稍后会被arange 覆盖。
  • 按索引或值的偶数/奇数?给出一个完整的工作示例。
  • 您的列表中的一个是偶数,另一个是奇数吗?还是两个列表都包含随机奇数和偶数元素?
  • 如果我理解正确,请参阅 docs.python.org/2/library/itertools.html#recipesstackoverflow.com/questions/2017895/… 中的循环(将其放入列表理解中以获取列表)
  • 当然,如果你有工作代码,但你希望它在一个新的列表 C 而不是 A,那么在 C = A.copy() 之后做同样的事情不是最有效的,但是如果你想要一个新的列表 C 而不是 A ...就去做吧。

标签: python numpy


【解决方案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】:

    我建议使用 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]
    

    【讨论】:

    • 我喜欢在 np 上使用,但另一个解决方案会失败,因为列表的长度不同。
    • @JohanSchiff 同意。但是从 OP 提供的 for 循环来看,我认为 AB 的长度相同。否则,合并奇数/偶数是有问题的,需要澄清。
    【解决方案3】:

    OP:如何创建一个新的列表 C,根据 A 和 B 的偶数/奇数元素合并它们?

    假设您有两个列表,其中包含混合的奇数/偶数元素,您可以将奇数/偶数元素分开并将它们存储在单独的列表中,然后使用 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
    

    【讨论】:

      【解决方案4】:

      结合使用 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()

      【讨论】:

        【解决方案5】:

        我认为您的数组大小为 8。由于您使用的是 numpy,请尝试此示例。

        # merge two arrays as intermittent leaves (even and odd shuffle).
        a = np.arange(5)
        first_array = np.arange(0,10,2)
        second_array = np.arange(1,11,2)
        res = np.empty(10)
        print (first_array)
        print (second_array)
        print (res)
        res[a * 2] = first_array
        res[a * 2 +1] = second_array
        print (res)
        

        【讨论】:

          猜你喜欢
          • 2013-08-05
          • 2016-09-01
          • 2020-01-03
          • 1970-01-01
          • 1970-01-01
          • 2021-07-18
          • 2019-04-28
          • 2017-01-26
          • 1970-01-01
          相关资源
          最近更新 更多