Поиск списка во вложенном списке с максимальным количеством самых высоких чисел

#python #max #comparison #nested-lists

#python #макс #сравнение #вложенные списки

Вопрос:

Я пытаюсь найти список во вложенном списке, который имеет максимальное количество самых высоких чисел, как показано ниже:

 test_list = [[200,1,100],[50,120,0],[40,300,0]]
desired output = [200,1,100]
 

[200,1,100] является победителем здесь, так как из его 3 цифр 2 выше, чем в других списках 2 числа. Однако это не будет зависеть от последовательности, например, если:

 test_list = [[1,100,200],[1,200,100],[200,1,100],[50,120,0],[40,300,0]]
desired output =  [[1,100,200],[1,200,100],[200,1,100]]
 

Причина в том, что здесь все три составляют «максимальный» набор цифр. Есть ли что-нибудь еще, кроме создания всех перестановок и их сравнения?

Редактировать: для дальнейшего пояснения, для примера выше, числа во вложенном списке 300>200>120>100> 50>40>1. Итак, какой список во вложенном списке имеет максимальное количество самых высоких чисел? [200,1,100]. Существует ли во вложенном списке другой список с большим количеством самых высоких чисел? Нет. Если бы [300,200,1] был во вложенном списке, он бы выиграл.

Чтобы обеспечить контекст, это оценки для нечеткого совпадения между серией строк для поиска ближайших совпадений, каждая из которых содержит 3 оценки в списке, в терминах, перечисленных в списке всех возможных совпадений. Это мой способ наиболее близкого сопоставления строк, сравнения нечетких оценок и извлечения списка с максимально возможными оценками из списка.

Комментарии:

1. Не могли бы вы более четко объяснить, почему [200,1,100] победитель?

2. @martineau не требуется, как четко указано «есть ли какой-либо другой способ многократных перестановок»

3. @El_1988: если true, OP должен был включить его в свой вопрос.

4. @martineau ссылка на последние две строки: «Есть ли что-нибудь еще, кроме создания всех перестановок и их сравнения?»

5. @martineau поскольку вопрос заключается в том, существует ли какой-либо другой способ, попытка создать перестановки исключительно для отображения здесь была бы запутанной для публикации и ненужной тратой времени.

Ответ №1:

Найдите максимальные значения, определив:

  • Определение функции сравнения
  • Используйте функцию сравнения в качестве ключа в max

Код

 from functools import cmp_to_key 

def compare(sublist1, sublist2):
    '''
        Comparator function
        
        With >, <, = defined to satisfy the 
        requirements for comparing sublists 
        the function:
        
        Returns:
            Positive when sublist1 > sublist2
            Negative when sublist1 < sublist2
            0        when sublsit1 == sublist2
    '''
    return sum(1 if x > y else -1 for x, y in zip(sorted(sublist1), sorted(sublist2)) if x != y)


def find_max(lst):
    # find max value in list (using custom compare function)
    # use cmp_to_key to key to convert compare function to key
    m = max(lst, key=cmp_to_key(compare))
    
    # Use list comprehension to get all values equal 
    # max (equal when compare(m, x) == 0)
    return [x for x in lst if compare(m, x)==0]
 

Тест

 print(find_max([[200,1,100],[50,120,0],[40,300,0]])) 
# Output: [[200, 1, 100]]

print(find_max([[1,100,200],[1,200,100],[200,1,100],[50,120,0],[40,300,0]])) 
# Output [[1, 100, 200], [1, 200, 100], [200, 1, 100]]

print(find_max([[9, 9, 0], [1, 1, 1]])) 
# Output: [[9, 9, 0]]

print(find_max([[100, 100, 44, 100, 100, 56, 38], [100, 100, 100, 100, 100, 100, 73], [100, 100, 100, 100, 100, 100, 73], [100, 100, 100, 100, 100, 56, 41], [100, 100, 100, 100, 100, 56, 41], [100, 100, 100, 100, 100, 56, 41]] ))
# Output: [[100, 100, 100, 100, 100, 100, 73], [100, 100, 100, 100, 100, 100, 73]]
 

Комментарии:

1. большое спасибо за код и ответ при вводе [[100, 100, 44, 100, 100, 56, 38], [100, 100, 100, 100, 100, 100, 73], [100, 100, 100, 100, 100, 100, 73],[100, 100, 100, 100, 100, 56, 41], [100, 100, 100, 100, 100, 56, 41], [100, 100, 100, 100, 100, 56, 41]] , для вывода это дает: [[100, 100,100, 100, 100, 56, 41], [100, 100, 100, 100, 100, 56, 41], [100, 100, 100, 100, 100, 56, 41]] , Я ожидал, что ответ будет таким [100, 100, 100, 100, 100, 100, 73], я делаю что-то не так?

2. @El_1988 — обновлен алгоритм. Дает ли это желаемые результаты?