【问题标题】:Python: Creating a function that compares 2 arrays and inserts the larger elements between the 2 arraysPython:创建一个比较 2 个数组并在 2 个数组之间插入较大元素的函数
【发布时间】:2020-01-21 05:18:57
【问题描述】:

我正在尝试创建一个函数来比较 2 个数组,并在不使用 numpy 的情况下创建一个包含列表中最大元素的新列表。我设法创建了一个手动版本,但在将其实现到函数中时遇到了问题。

任务:创建一个函数 maximum_arrays(a,b),它按元素比较数组 a 和 b,并返回一个包含较大元素的新数组。使用 insert2 函数将新元素添加到列表中。

示例:将函数应用于数组 a=[12,5,8,19,6] 和 b=[3,6,2,12,4],结果应为 c=[12,6, 8,19,6]。

当前代码:

list_a = [12,5,8,19,6]
list_b = [3,6,2,12,4]

maximum_arrays = []
for item in list_a:
    if list_b[item] > list_a[item]:
        maximum_arrays.insert(list_b[item])
    else:
        maximum_arrays.insert(list_a[item])

print(maximum_arrays)

手动版:

list_a = [12,5,8,19,6]
list_b = [3,6,2,12,4]
#answer example
c = [12,6,8,19,6]

#empty list
maximum_arrays = []

#for each part of the list, choose the highest number of the other list and insert
maximum_arrays.insert(0, max(list_a[0],list_b[0]))
maximum_arrays.insert(1, max(list_a[1],list_b[1]))
maximum_arrays.insert(2, max(list_a[2],list_b[2]))
maximum_arrays.insert(3, max(list_a[3],list_b[3]))
maximum_arrays.insert(4, max(list_a[4],list_b[4]))

print(maximum_arrays)

【问题讨论】:

    标签: python arrays list function insert


    【解决方案1】:

    在压缩列表的列表理解中使用max,或numpy.max

    list_a = [12,5,8,19,6]
    list_b = [3,6,2,12,4]
    
    max_array = [max(i) for i in zip(list_a, list_b)]
    
    print(max_array)
    

    这里的解释是:zip 将 n 个可迭代对象转换为元组上的迭代器,其中每个元组都有 n 项。所以,在两个列表的情况下,zip([1, 2, 3], [4, 5, 6]) 变成了((1, 4), (2, 5), (3, 6))。取所有这些元组中的max 即可得到您的列表。

    一个重要的警告,也是让我数次焦头烂额的一个警告,就是生成的元组的数量是zip最短 迭代的长度。换句话说,zip 在传递不同长度的可迭代对象时不会抛出异常,只是在输入列表之一用完时停止。在这方面它与numpy.max 不同,后者在给定不同长度的列表时会引发错误。

    【讨论】:

      【解决方案2】:

      你在寻找这样的东西吗:

      list_a = [12,5,8,19,6]
      list_b = [3,6,2,12,4]
      
      l = []
      for i,j in enumerate(zip(list_a, list_b)):
          l.insert(i, max(j))
      
      print(l)
      

      【讨论】:

        【解决方案3】:

        使用itertools.starmap的其他方式:

        list(starmap(max, zip(list_a, list_b)))
        

        输出:

        [12, 6, 8, 19, 6]
        

        这比列表理解快 1.4 倍:

        %timeit list(starmap(max, zip(list_a, list_b)))
        # 1.19 µs ± 49.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
        
        %timeit [max(i) for i in zip(list_a, list_b)]
        # 1.69 µs ± 213 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
        

        【讨论】:

          【解决方案4】:

          您可以解决多种方法,与您的函数或使用 zip 函数的列表理解相同。 下面的解决方案,如果两个长度相同,则取一个列表长度并迭代并使用“追加”/“插入”选项将值添加到列表中。

          list_a = [12,5,8,19,6]
          list_b = [3,6,2,12,4]
          
          maximum_arrays = []
          list_length = len(list_a)
          for item in range(list_length):
          if list_b[item] > list_a[item]:
              maximum_arrays.append(list_b[item])
          else:
              maximum_arrays.append(list_a[item])
          
          print(maximum_arrays)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-07-25
            • 2020-02-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多