#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 — обновлен алгоритм. Дает ли это желаемые результаты?