Используйте max () для поиска 3 самых высоких результатов в столбце [дубликат]

Программа для интерфейса позволяет легко изменять реализацию контракта, определяемого интерфейсом. Он позволяет свободно связываться между контрактом и конкретными реализациями.

IInterface classRef = new ObjectWhatever()

Вы можете использовать любой класс, который реализует IInterface? Когда вам это нужно?

blockquote>

Взгляните на этот вопрос SE на хорошем примере.

Почему должен быть предпочтительным интерфейс для класса Java?

использует ли производительность интерфейса?

if так сколько?

blockquote>

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

как вы можете избежать этого, не имея необходимости поддерживать два бита кода?

blockquote>

Не пытайтесь избежать нескольких реализаций интерфейса, если ваше приложение нуждается в них , В отсутствие жесткой связи интерфейса с одной конкретной реализацией вам может потребоваться развернуть патч, чтобы изменить одну реализацию на другую реализацию.

Один хороший вариант использования: реализация шаблона стратегии:

Реальный мир Пример шаблона стратегии

5
задан Hashim Majeed 30 August 2015 в 13:29
поделиться

8 ответов

Если значения могут появляться в вашем списке повторно, вы можете попробовать это решение.

def search(Fscore_list, num=3):
    l = Fscore_list
    res = dict([(v, []) for v in sorted(set(l), reverse=True)[:num]])
    for index, val in enumerate(l):
        if val in res:
            res[val].append(index)
    return sorted(res.items(), key=lambda x: x[0], reverse=True)

Сначала он найдет самые высокие значения num=3 и создаст dict с пустым list для индексов для него. Затем он перейдет по списку и для каждого из самых высоких значений (val in res) сохранит его индексы. Затем просто верните отсортированный список кортежей, например [(highest_1, [indexes ...]), ..]. например,

>>> l = [9, 7, 43, 2, 4, 7, 43, 8, 5, 8, 4]
>>> print(search(l))
[(43, [2, 6]), (9, [0]), (8, [7, 9])]

Для печати позиций выполните следующее:

>>> Fscore_list = [9, 7, 43, 2, 4, 7, 43, 8, 5, 8, 4, 43, 43, 43]
>>> result = search(Fscore_list)
>>> print("1st. %d on positions %s" % (result[0][0], result[0][1]))
1st. 43 on positions [2, 6, 11, 12, 13]
>>> print("2nd. %d on positions %s" % (result[1][0], result[1][1]))
2nd. 9 on positions [0]
>>> print("3rd. %d on positions %s" % (result[2][0], result[2][1]))
3rd. 8 on positions [7, 9]
0
ответ дан beezz 22 August 2018 в 11:36
поделиться
  • 1
    не могли бы вы напечатать его с именами переменных? – Hashim Majeed 30 August 2015 в 13:44
  • 2
    Этого достаточно? Я не вижу в своем коде какой-либо другой переменной. – beezz 30 August 2015 в 13:47
  • 3
    откуда приходит число 3 и как я печатаю позиции 1-го, 2-го и 3-го, включая совместные ряды – Hashim Majeed 30 August 2015 в 13:58
  • 4
    num=3 является аргументом функции со значением по умолчанию 3, потому что вы ищете 1-й, 2-й и 3-й. Если бы вы искали 4-й, вы бы вызвали функцию с помощью num=4, например. search(Fscore_list, num=4). – beezz 30 August 2015 в 14:01
  • 5
    хорошо спасибо и как мне печатать позиции – Hashim Majeed 30 August 2015 в 14:06
0
ответ дан bereal 22 August 2018 в 11:36
поделиться

None всегда считается меньше любого числа.

>>> None<4
True
>>> None>4
False

Найти наивысший элемент и его индекс. Замените его на None. Найдите новый наивысший элемент и его индекс. Это будет второе место в первоначальном списке. Замените его на None. Найти новый наивысший элемент, который на самом деле является третьим.

Необязательно: восстановить найденные элементы в списке.

Это O (количество наивысших элементов * размер списка) поэтому он плохо масштабируется, если ваши «три» растут, но сейчас это O (3n).

-1
ответ дан Emilio M Bumachar 22 August 2018 в 11:36
поделиться

Начните с сортировки списка в порядке убывания:

my_list = [1, 2, 8, 4, 7, 6, 5, 3]
sorted_list = sorted(my_list, reverse=True)
print(sorted_list)

Выход:

[8, 7, 6, 5, 4, 3, 2, 1]

Затем вы можете извлечь индекс из трех самых больших элементов (первые 3 элемента sorted_list) следующим образом:

index_of_highest = my_list.index(sorted_list[0])
index_of_second_highest = my_list.index(sorted_list[1])
index_of_third_highest = my_list.index(sorted_list[2])
-1
ответ дан gtlambert 22 August 2018 в 11:36
поделиться
  • 1
    Небольшая проза (объясняя, что это делает) значительно улучшит этот ответ. – Elliott Frisch 30 August 2015 в 22:34

Добавьте все значения в список в набор.

Найдите индекс из трех верхних значений в наборе в исходном списке.

]

Изменить

thelist = [1, 45, 88, 1, 45, 88, 5, 2, 103, 103, 7, 8]
theset = frozenset(thelist)
theset = sorted(theset, reverse=True)

print('1st = ' + str(theset[0]) + ' at ' + str(thelist.index(theset[0])))
print('2nd = ' + str(theset[1]) + ' at ' + str(thelist.index(theset[1])))
print('3rd = ' + str(theset[2]) + ' at ' + str(thelist.index(theset[2])))

Изменить

Вы все еще не сказали нам, как обращаться с «совместными победителями», но, глядя на ваши ответы на другие ответы, я предполагаю, возможно, это может быть то, что вы пытаетесь сделать, может быть? Если это не тот результат, который вы хотите, дайте нам пример вывода, который вы надеетесь получить.

thelist = [1, 45, 88, 1, 45, 88, 5, 2, 103, 103, 7, 8]
theset = frozenset(thelist)
theset = sorted(theset, reverse=True)
thedict = {}
for j in range(3):
    positions = [i for i, x in enumerate(thelist) if x == theset[j]]
    thedict[theset[j]] = positions

print('1st = ' + str(theset[0]) + ' at ' + str(thedict.get(theset[0])))
print('2nd = ' + str(theset[1]) + ' at ' + str(thedict.get(theset[1])))
print('3rd = ' + str(theset[2]) + ' at ' + str(thedict.get(theset[2])))

Выход

1st = 103 at [8, 9]
2nd = 88 at [2, 5]
3rd = 45 at [1, 4]

Кстати: что, если все значения одинаковы (равны первым) или по какой-то другой причине нет третьего места? (или второе место?). Вам нужно защититься от этого? Если вы это сделаете, я уверен, что вы можете разработать соответствующие защитные экраны, чтобы добавить код.

1
ответ дан jwpfox 22 August 2018 в 11:36
поделиться
  • 1
    Да, но это так, но как я это делаю, плюс также могут быть объединенные звания – Hashim Majeed 30 August 2015 в 13:29
  • 2
    Я добавил код, чтобы дать вам представление о том, как делать то, о чем я говорил. Я не понимаю, что «плюс могут быть также средние звания». Не могли бы вы объяснить это дальше. – jwpfox 30 August 2015 в 13:44
  • 3
    например, на втором месте может быть более одного победителя – Hashim Majeed 30 August 2015 в 13:52
  • 4
    Вы должны научиться быть более четкими в своем общении. Часто бывает проще использовать примеры, чтобы прояснить ситуацию. Вы имеете в виду, используя значения в «списке», чтобы результат был 1st = 103 at 8, 2nd = 103 at 9, 3rd = 88 at 2 или вы имеете в виду что-то еще? Вы должны вытащить его из головы и на страницу таким образом, чтобы люди не в голове знали, что у вас в голове. Одна из самых сложных задач в программировании, но вы должны справиться с этим. – jwpfox 30 August 2015 в 13:56

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

Также обратите внимание, если аргумент ключевого слова (ordered_nums_to_return) больше длины списка, он вернет целое список в порядке убывания. если вам нужно, чтобы создать исключение, вы можете добавить проверку функции. Если аргументы не переданы, он вернет наивысшее значение, снова вы можете изменить это поведение, если вам нужно.

list_of_nums = [2, 4, 23, 7, 4, 1]


def find_highest_values(list_to_search, ordered_nums_to_return=None):
    if ordered_nums_to_return:
        return sorted(set(list_to_search), reverse=True)[0:ordered_nums_to_return]
    return [sorted(list_to_search, reverse=True)[0]]

print find_highest_values(list_of_nums, ordered_nums_to_return=4)
0
ответ дан Ravi 22 August 2018 в 11:36
поделиться

Используйте heapq.nlargest :

>>> import heapq
>>> [i
...     for x, i
...     in heapq.nlargest(
...         3,
...         ((x, i) for i, x in enumerate((0,5,8,7,2,4,3,9,1))))]
[7, 2, 3]
2
ответ дан robert 22 August 2018 в 11:36
поделиться
  • 1
    А позиции значений являются частью требований? – jwpfox 30 August 2015 в 14:29
  • 2
    И обрабатывать мультипликаторы одинакового значения? Это сложно, потому что у ОП возникают проблемы с выражением этого требования :) – jwpfox 30 August 2015 в 14:41

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

lst = [9,7,43,2,4,7,8,5,4]
print( sorted( [(x,i) for (i,x) in enumerate(lst)], reverse=True )[:3] )

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

lst = [9,7,43,2,4,7,8,5,4]
ranks = sorted( [(x,i) for (i,x) in enumerate(lst)], reverse=True )
values = []
posns = []
for x,i in ranks:
    if x not in values:
        values.append( x )
        posns.append( i )
        if len(values) == 3:
            break
print zip( values, posns )
3
ответ дан Scott Hunter 22 August 2018 в 11:36
поделиться
  • 1
    хорошо спасибо, но там могут быть объединенные звания, т. е. два вторых победителя – Hashim Majeed 30 August 2015 в 13:31
Другие вопросы по тегам:

Похожие вопросы: