Нахождение наибольшей и наименьшей разницы между 1-м и 2-м элементом 2d-элементов массива - PullRequest
2 голосов
/ 07 апреля 2019

Я создал функцию, которая принимает список 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.Есть ли простой ярлык (встроенная функция и т. Д.), Чтобы сделать его короче?

Ответы [ 2 ]

2 голосов
/ 07 апреля 2019

Основная идея состоит в том, чтобы отслеживать значения min и max, но также иметь отдельные списки для отслеживания каждой пары

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 

Driver

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]])

2 голосов
/ 07 апреля 2019

Если вы хотите сохранить все пары, если это максимальная / минимальная, вы можете попробовать это (я прокомментировал, где я это упростил):

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-строчное решение, более питонное, но дороже:

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]

Надеюсь, что это поможет вам, и прокомментируйте, если у вас есть дополнительные вопросы.:)

...