Найти - Пользователи
Полная версия: Сортировка словаря и условие
Начало » Python для новичков » Сортировка словаря и условие
1 2 3
paraman
Здравствуйте.
Не могу придумать, как красиво реализовать задачу.
Есть список со словарями.
[{'Percent': 1.54084398, 'Draw_percent': 15.95721298, 'Position': '1'}, {'Percent': 1.54084398, 'Draw_percent': 16.77778592, 'Position': '2'}, {'Percent': 1.246612466, 'Draw_percent': 16.81441864, 'Position': '3'}, {'Relax': '46', 'Percent': 0.743321719, 'Draw_percent': 17.00490878, 'Position': '4'}, {'Percent': 0.743321719, 'Draw_percent': 15.92058026, 'Position': '5'}, {'Percent': 2.036391792, 'Draw_percent': 17.05619459, 'Position': '6'}]

Мне необходимо найти минимальное значение ключа Percent и если это значение не одно, то прибавить к нему значение ключа Draw_percent.
Затем вернуть минимальное значение полученное в ходе манипуляции. В данном примере это будет ‘Position’: ‘5’

Спасибо, что уделили моему вопросу своё время.
GreyZmeem
# -*- coding: utf-8 -*-
my_list = [
    {'Percent': 1.54084398, 'Draw_percent': 15.95721298, 'Position': '1'}, 
    {'Percent': 1.54084398, 'Draw_percent': 16.77778592, 'Position': '2'}, 
    {'Percent': 1.246612466, 'Draw_percent': 16.81441864, 'Position': '3'}, 
    {'Relax': '46', 'Percent': 0.743321719, 'Draw_percent': 17.00490878, 'Position': '4'}, 
    {'Percent': 0.743321719, 'Draw_percent': 15.92058026, 'Position': '5'}, 
    {'Percent': 2.036391792, 'Draw_percent': 17.05619459, 'Position': '6'},
]
percent = min([x['Percent'] for x in my_list])
position = sorted(filter(lambda x: x['Percent'] == percent, my_list), key=lambda k: k['Percent'] + k['Draw_percent'])[0]['Position']
print 'Percent: {}, Position: {}'.format(percent, position)
Percent: 0.743321719, Position: 5
paraman
Я пока так написал.

my_listMin = min(item['Percent'] for item in my_list)
print list(item for item in my_list if item['Percent'] + item['Draw_percent'] == min(item['Percent'] + item['Draw_percent'] for item in list(item for item in my_list if item['Percent'] == my_listMin)))
py.user.next
>>> lst = [{'Percent': 1.54084398,
...         'Draw_percent': 15.95721298,
...         'Position': '1'},
...        {'Percent': 1.54084398,
...         'Draw_percent': 16.77778592,
...         'Position': '2'},
...        {'Percent': 1.246612466,
...         'Draw_percent': 16.81441864,
...         'Position': '3'},
...        {'Relax': '46',
...         'Percent': 0.743321719,
...         'Draw_percent': 17.00490878,
...         'Position': '4'},
...        {'Percent': 0.743321719,
...         'Draw_percent': 15.92058026,
...         'Position': '5'},
...        {'Percent': 2.036391792,
...         'Draw_percent': 17.05619459,
...         'Position': '6'}]
>>> 
>>> m = min(i['Percent'] for i in lst)
>>> d = min((i for i in lst if i['Percent'] == m),
...         key=lambda i: i['Draw_percent'])
>>> d
{'Draw_percent': 15.92058026, 'Percent': 0.743321719, 'Position': '5'}
>>>

add
Сократил запись.
>>> lst = [{'Percent': 1.54084398,
...         'Draw_percent': 15.95721298,
...         'Position': '1'},
...        {'Percent': 1.54084398,
...         'Draw_percent': 16.77778592,
...         'Position': '2'},
...        {'Percent': 1.246612466,
...         'Draw_percent': 16.81441864,
...         'Position': '3'},
...        {'Relax': '46',
...         'Percent': 0.743321719,
...         'Draw_percent': 17.00490878,
...         'Position': '4'},
...        {'Percent': 0.743321719,
...         'Draw_percent': 15.92058026,
...         'Position': '5'},
...        {'Percent': 2.036391792,
...         'Draw_percent': 17.05619459,
...         'Position': '6'}]
>>> 
>>> d = min(lst, key=lambda i: (i['Percent'], i['Draw_percent']))
>>> d
{'Draw_percent': 15.92058026, 'Percent': 0.743321719, 'Position': '5'}
>>>
paraman
Спасибо, понял
paraman
py.user.next

Каюсь, не до конца уловил. Пытался использовать lambda, чтобы ускорить выполнение, но не получается.
Написал так, но жутко возрастает время, если данных в переменной data в районе 10000 и более.

ID = ['c_gsh_t.Srte6f:tesrs.o/sg', 'g3.erSi3th:12l9PgPr/iit/m', '//aRue-fatriR_teot-9tn_s-', '3/em-r0fninrre-I/rhefrfDe']
data = [{'Position': '8', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '1'}, {'Position': '1', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '6'}, {'Position': '2', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '2'}, {'Position': '3', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '4'}, {'Position': '4', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '7'}, {'Position': '5', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '5'}, {'Position': '6', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '3'}, {'Position': '7', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '8'}, {'Position': '9', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '9'}, {'Position': '4', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '5'}, {'Position': '2', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '2'}, {'Position': '1', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '3'}, {'Position': '5', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '4'}, {'Position': '6', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '1'}, {'Position': '3', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '6'}, {'Position': '3', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '3'}, {'Position': '1', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '1'}, {'Position': '2', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '2'}, {'Position': '4', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '4'}, {'Position': '3', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '5'}, {'Position': '1', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '3'}, {'Position': '2', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '1'}, {'Position': '6', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '2'}, {'Position': '5', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '4'}, {'Position': '4', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '6'}]
 
TemperatureSensors = []
def checkDraw(data, number_draw):
    return list(item for item in data if int(item['Draw']) == number_draw)
 
for ID_i in ID:
    data_ID = list(item for item in data if item['ID'] == ID_i)
    Data_tem = list(item for item in list(item for item in data if item['ID'] == ID_i) if item['Position'] == '1')[0]
    tmpDraw = []
    for i in range(1, len(data_ID) + 1):
        tmpDraw.append(checkDraw(data_ID, i))
    if len(data_ID) == len(tmpDraw):
        temp = []
        temp.append(Data_tem['Draw'])
        temp.append(len(data_ID))
        TemperatureSensors.append(temp)
 
print TemperatureSensors

Какими способами можно ускорить выполнение?
Спасибо, что уделили моему вопросу своё время.
py.user.next
Опиши, что пытаешься сделать с ID и data, какой результат получить.
paraman
Мне нужно перебрать весь список, где ID равен.
По id находится один из датчиков температуры и день его работы.
Затем найти всели позиции draw заполнены за этим id.
Далее в конце нужен список тех датчиков у кого позиция была первой в указанном id.
Я же привел кусок кода. Вроде там вся логика есть.
Спасибо, за попытки понять и помочь.
py.user.next
paraman
Затем найти всели позиции draw заполнены за этим id.
А если не все? Если встретил незаполненную draw?

paraman
Я же привел кусок кода.
По коду выводы не делаются, потому что он может быть неправильным (делать не то, что должен).
paraman
py.user.next
Не заполненного draw быть не может. При заполнение стоит проверка, но ему может быть присвоен ошибочный номер.
Для проверки этого я и добавил функцию checkDraw.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB