2015-06-13 3 views
-2

У меня есть список имен, x и список оценок y, которые соответствуют именам.Поиск 5 наименьших чисел из списка в Python

x = {a,b,c,d,e,f,g,h,i,j,k} 
y= {8,8,15,13,12,17,18,12,14,14} 

Таким образом, имеет счет 8, б имеет оценки 8, с имеет счет 15, ..., к имеет счет 14

Я хочу найти 5 наименьшие оценки из списка, у, и получить свое имя и иметь распечатку, похожий на следующие:

топ5 низкие баллы:

a : 8 
b : 8 
e : 12 
h : 12 
d : 13 

в настоящее время я создаю копию списка, а затем с помощью поп-музыки, чтобы сохранить сокращение списка, но это дает мне неправильный n для оценки. Однако, когда я создаю свой список для значений max5, все получается отлично, используя тот же метод. Я не уверен в функции, которая позволяет мне делать это в python. Это всего лишь образец моей проблемы, моя реальная проблема связана с местоположением магазина и оценками для тех магазинов, которые я вычислил из функции, но я хочу получить 5 лучших наивысших и 5 наименьших баллов. Кто-нибудь имеет эффективное решение?

+2

Ваша структура данных неверна. Используйте словарь. – TigerhawkT3

+0

'x = {1, 3, 4, 5}' является множеством и его элементы имеют случайный порядок, unli ke список. –

ответ

6

Python имеет структуру данных, называемую Dictionary, которую вы можете использовать для хранения пар ключ/значение. В Python, словарь определяется как -

dict = {'a':8 , 'b':8, 'c':15, 'd':13 ...} 

Затем вы можете перебрать пар ключ-значение в этом словаре, чтобы найти 5 наименьшее число.

Вы можете преобразовать Dict в кортеж, а затем отсортировать кортеж на основе второго item-

import operator 
dict = {'a':8 , 'b':8, 'c':15, 'd':13 ...} 
sorted_dict = sorted(dict.items(), key=operator.itemgetter(1)) 

Вместо того, чтобы использовать Dict, вы можете также использовать list of tuples и использовать последнюю строку в выше кода для его сортировки на основе второго элемента каждого кортежа.

Список кортежей будет выглядеть -

scores = [('a',8),('b',8),('c',15),('d',13)..] 
2

Прежде всего, организовать свою коллекцию вход

Предположим, у вас есть вход x и y, где каждый из них является коллекция этикеток и оценка, соответственно:

x = ['a','b','c','d','e','f','g'] 
y = [5,3,10,2,2,1,0] 

Сортировка x на соответствующий счет y, пронестись их вместе и сортировать по партитуре, занимают первые 5 и то это:

min_list = sorted(zip(x,y), key=lambda t: t[1])[5:] 

Краткое объяснение

Он молниеносно х и у вместе поэтому у вас есть список zip (x, y) = ('a', 5), ('b', 3), ...

Затем отсортировать этот список по второму элементу каждого кортежа отсортирован (зип (х, у)) где ключ сортировки является вторым элементом кортежа (т [1])

Наконец, занимают первые 5 элементов отсортированного списка [5:]

Ваша результирующая коллекция выглядит следующим образом:

[('g', 0), ('f', 1), ('d', 2), ('e', 2), ('b', 3)] 
+0

Удивительная благодарность, тогда, если я хочу напечатать: 'f': 1 как я могу назвать словарь? print min_list [1] [0], ':', 'min_list [1] [1]? –

+0

, и если бы я хотел сделать max, я бы просто сделал min_list = sorted (zip (x, y), key = lambda t: t [1]) [: 5] вместо min_list = sorted (zip (x, y) , key = lambda t: t [1]) [5:] –

+0

На самом деле в Python есть много встроенных функций, которые выполняют вашу работу. Чтобы найти max в списке, вы можете: max (zip (x, y), key: lambda t: t [1]) ' –

1

Прежде всего, {8,8,15...} бы создать set, не list; поскольку наборы не упорядочены, вы не можете объединить два сета таким образом.

Таким образом, вы должны были бы

x = ['a','b','c','d','e','f','g','h','i','j','k'] 
y = [8, 8, 15, 13, 12, 17, 18, 12, 14, 14] 

Теперь, чтобы сделать их в letter, score пар, используйте функцию zip.

pairs = zip(x, y) 

И тогда вы можете найти п малейших деталей с подходящим названием nsmallest функции от heapq модуля; вам необходимо предоставить пользовательскую функцию key, которая обеспечит оценку для каждого элемента; мы будем использовать operator.itemgetter(1) для него (она возвращает элемент 1 или score для каждой letter, score пары:

from operator import itemgetter 
from heapq import nsmallest 

result = nsmallest(5, pairs, key=itemgetter(1)) 
print(result) 

распечатывает

[('a', 8), ('b', 8), ('e', 12), ('h', 12), ('d', 13)] 

Чтобы получить письма только, просто добавьте:

letters = [ i[0] for i in result ]