Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 7, 2014 10:34:26

paraman
Зарегистрирован: 2012-07-10
Сообщения: 170
Репутация: +  1  -
Профиль   Отправить e-mail  

Сортировка словаря и условие

Здравствуйте.
Не могу придумать, как красиво реализовать задачу.
Есть список со словарями.

[{'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’

Спасибо, что уделили моему вопросу своё время.

Отредактировано paraman (Авг. 7, 2014 11:18:20)

Офлайн

#2 Авг. 7, 2014 12:03:06

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

Сортировка словаря и условие

# -*- 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

Отредактировано GreyZmeem (Авг. 7, 2014 12:03:17)

Офлайн

#3 Авг. 7, 2014 12:08:44

paraman
Зарегистрирован: 2012-07-10
Сообщения: 170
Репутация: +  1  -
Профиль   Отправить e-mail  

Сортировка словаря и условие

Я пока так написал.

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)))

Офлайн

#4 Авг. 7, 2014 12:21:02

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Сортировка словаря и условие

>>> 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'}
>>>



Отредактировано py.user.next (Авг. 8, 2014 06:21:27)

Офлайн

#5 Авг. 7, 2014 12:45:27

paraman
Зарегистрирован: 2012-07-10
Сообщения: 170
Репутация: +  1  -
Профиль   Отправить e-mail  

Сортировка словаря и условие

Спасибо, понял

Офлайн

#6 Авг. 12, 2014 01:02:47

paraman
Зарегистрирован: 2012-07-10
Сообщения: 170
Репутация: +  1  -
Профиль   Отправить e-mail  

Сортировка словаря и условие

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

Какими способами можно ускорить выполнение?
Спасибо, что уделили моему вопросу своё время.

Отредактировано paraman (Авг. 12, 2014 01:07:31)

Офлайн

#7 Авг. 12, 2014 01:25:35

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Сортировка словаря и условие

Опиши, что пытаешься сделать с ID и data, какой результат получить.



Офлайн

#8 Авг. 12, 2014 02:36:07

paraman
Зарегистрирован: 2012-07-10
Сообщения: 170
Репутация: +  1  -
Профиль   Отправить e-mail  

Сортировка словаря и условие

Мне нужно перебрать весь список, где ID равен.
По id находится один из датчиков температуры и день его работы.
Затем найти всели позиции draw заполнены за этим id.
Далее в конце нужен список тех датчиков у кого позиция была первой в указанном id.
Я же привел кусок кода. Вроде там вся логика есть.
Спасибо, за попытки понять и помочь.

Офлайн

#9 Авг. 12, 2014 03:27:32

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Сортировка словаря и условие

paraman
Затем найти всели позиции draw заполнены за этим id.
А если не все? Если встретил незаполненную draw?

paraman
Я же привел кусок кода.
По коду выводы не делаются, потому что он может быть неправильным (делать не то, что должен).



Офлайн

#10 Авг. 12, 2014 06:30:45

paraman
Зарегистрирован: 2012-07-10
Сообщения: 170
Репутация: +  1  -
Профиль   Отправить e-mail  

Сортировка словаря и условие

py.user.next
Не заполненного draw быть не может. При заполнение стоит проверка, но ему может быть присвоен ошибочный номер.
Для проверки этого я и добавил функцию checkDraw.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version