Форум сайта python.su
1
Здравствуйте.
Не могу придумать, как красиво реализовать задачу.
Есть список со словарями.
[{'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'}]
Отредактировано paraman (Авг. 7, 2014 11:18:20)
Офлайн
34
# -*- 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)
Офлайн
1
Я пока так написал.
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)))
Офлайн
857
>>> 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'} >>>
>>> 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)
Офлайн
1
Спасибо, понял 
Офлайн
1
py.user.next
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)
Офлайн
857
Опиши, что пытаешься сделать с ID и data, какой результат получить.
Офлайн
1
Мне нужно перебрать весь список, где ID равен.
По id находится один из датчиков температуры и день его работы.
Затем найти всели позиции draw заполнены за этим id.
Далее в конце нужен список тех датчиков у кого позиция была первой в указанном id.
Я же привел кусок кода. Вроде там вся логика есть.
Спасибо, за попытки понять и помочь.
Офлайн
857
paramanА если не все? Если встретил незаполненную draw?
Затем найти всели позиции draw заполнены за этим id.
paramanПо коду выводы не делаются, потому что он может быть неправильным (делать не то, что должен).
Я же привел кусок кода.
Офлайн
1
py.user.nextНе заполненного draw быть не может. При заполнение стоит проверка, но ему может быть присвоен ошибочный номер.
Офлайн