【问题标题】:Finding biggest and smallest difference between 1st and 2nd element of 2d array elements查找二维数组元素的第一个和第二个元素之间的最大和最小差异
【发布时间】:2019-08-28 12:23:35
【问题描述】:

我制作了一个函数,它以 2d 元素列表(包含具有 2 个元素的列表)作为参数,并返回元素差异最大的元素(或多个元素)和元素差异最大的元素(或更多)是最小的。例如,给定一个参数 ([2,8],[3,4],[2,7],[4,10]),函数将返回:max=([2,8], [4,10 ]), min=[3,4].

我已经创建了一个函数,但是代码相当大,我没有添加我填充列表的部分作为参数传递给用户输入,我也想做。

def maxminIntervals(lst):
 mx=lst[0][1]-lst[0][0]
 mn=mx
 count_max=count_min=0

 max=[]
 min=[]
 print(max,min)
 print(mx,mn)
 for element in lst:
    y=element[1]-element[0]
    if y>mx:
        max=[]
        max.append(element)
        count_max=0
        mx=y
    elif y==mx:
        max.append(element)
        mx=y
        count_max+=1
    if y<mn:
        min=[]
        min.append(element)
        count_min=0
        mn=y
    elif y==mn:
        min.append(element)
        mn=y
        count_min+=1
    print(y)
 print("Max=",end='')
 if count_max>0:
        print("(",end=" ")
 for i in max:
    print(i,end=' ')
 if count_max>0:
        print(")",end=" ")
 print("\n")
 print("Min=",end=' ')
 if count_min>0:
        print("(",end=" ")
 for i in min:
    print(i,end=' ')
 if count_min>0:
    print(")",end=" ")

在我看来,代码对于 Python 来说太大了。有没有简单的快捷方式(内置函数等)让它更短?

【问题讨论】:

    标签: python arrays list max min


    【解决方案1】:

    如果你想保留所有对,如果它是最大/最小,你可以试试这个(我已经评论了我简化它的地方):

    def maxminIntervals(lst):
        max_diff, min_diff = float('-inf'), float('inf')
        max_results, min_results = [], []
        # for loop and unzip pairs to num1, num2
        for num1, num2 in lst:
            # define diff to compare min and max
            diff = num2 - num1
            # append to max_results
            if diff == max_diff:
                max_results.append([num1, num2])
            # update a new max_results
            elif diff > max_diff:
                max_diff = diff
                max_results = [[num1, num2]]
    
            # append to min_results
            if diff == min_diff:
                min_results.append([num1, num2])
            # update a new min_results
            elif diff < min_diff:
                min_diff = diff
                min_results = [[num1, num2]]
        return max_results, min_results
    
    def test():
        lst = ([2, 8], [3, 4], [2, 7], [4, 10])
        max_results, min_results = maxminIntervals(lst)
        print('max results:', max_results)
        print('min results:', min_results)
    

    输出:

    max results: [[2, 8], [4, 10]]
    min results: [[3, 4]]
    

    这是一个 4 行的解决方案,更 Pythonic,但成本更高:

    from collections import defaultdict
    from operator import itemgetter
    
    def maxminIntervals2(lst):
        diff_dict = defaultdict(list)
        for pair in lst:
            diff_dict[pair[1] - pair[0]].append(pair)
        return max(diff_dict.items(), key=itemgetter(0))[1], min(diff_dict.items(), key=itemgetter(0))[1]
    

    希望对您有所帮助,如果您还有其他问题,请发表评论。 :)

    【讨论】:

      【解决方案2】:

      主要思想是跟踪 minmax 值,但也有单独的列表来跟踪每一对

      def maxMinIntervals(lst):
          maximum, minimum = [], []
          max_value, min_value = float('-inf'), float('inf')
          for pair in lst:
              value = abs(pair[1] - pair[0])
              if value > max_value:
                  max_value = value
                  maximum = []
                  maximum.append(pair)
              elif value == max_value:
                  maximum.append(pair)
              if value < min_value:
                  minimum = []
                  minimum.append(pair)
                  min_value = value
              elif value == min_value:
                  minimum.append(pair)
          return maximum, minimum 
      

      司机

      input_list = [[2,8], [3,4], [2,7], [4,10]]
      max_ans, min_ans = maxMinIntervals(input_list)
      print('maximum results: ', max_ans)
      print('minimum results: ', min_ans)
      

      输出

      ('最大结果:', [[2, 8], [4, 10]])

      ('最小结果:', [[3, 4]])

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-13
        相关资源
        最近更新 更多