Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 25, 2012 20:10:30

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

Помогите с условием

Люди добрые, помогите. Что-то у меня ступор, не могу придумать условие или действие.
Есть переменная Z нужно найти в ней ID в котором есть тип E и нет типа F, в данном примере это ID 110

z = [{'ID': '100', 'Type': 'E'}, {'ID': '100', 'Type': 'E'}, {'ID': '100', 'Type': 'F'}, {'ID': '101', 'Type': 'E'}, {'ID': '101', 'Type': 'F'}, {'ID': '103', 'Type': 'F'}, {'ID': '103', 'Type': 'E'}, {'ID': '103', 'Type': 'E'}, {'ID': '110', 'Type': 'E'}, {'ID': '110', 'Type': 'E'}, {'ID': '200', 'Type': 'E'}, {'ID': '200', 'Type': 'E'}, {'ID': '200', 'Type': 'F'}]

Что-то туплю сильно.
Спасибо, за помощь.

Офлайн

#2 Авг. 25, 2012 20:33:28

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Помогите с условием

type_f_ids = set(x['ID'] for x in z if x['Type'] == 'F')
result = [x for x in z if x['ID'] not in type_f_ids]

upd
если кроме F и E могут еще быть:
result = [x for x in z if x['Type'] == 'E' and x['ID'] not in type_f_ids]

Отредактировано reclosedev (Авг. 25, 2012 20:41:10)

Офлайн

#3 Авг. 26, 2012 00:04:54

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

Помогите с условием

Спасибо большое за потраченное на мой вопрос время. Но мне как новичку сложно читать сокращённые условия (Условие в строчку).
Если Вас не затруднит, не могли бы вы расписать в пару строчек условие или более.

Офлайн

#4 Авг. 26, 2012 00:49:48

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Офлайн

#5 Авг. 26, 2012 01:03:35

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Помогите с условием

Ну и что я писал по поводу forum driven develoment? xD Не грузите нубов сложными вещами.

paraman, это можно переписать в более привычном виде так:

# время поиска в set практически не зависит от количества элементов в нем
type_f_ids = set()
for x in z:
    if x['Type'] == 'F':
        type_f_ids.add(x)
result = []
for x in z:
    if x['ID'] not in type_f_ids:
        result.append(x)
Как ты видишь, вариант со списковыми выражениями гораздо короче.

Офлайн

#6 Авг. 26, 2012 09:03:19

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Помогите с условием

odnochlen
Ну и что я писал по поводу forum driven develoment? xD Не грузите нубов сложными вещами.

paraman, это можно переписать в более привычном виде так:
# время поиска в set практически не зависит от количества элементов в нем
type_f_ids = set()
for x in z:
    if x['Type'] == 'F':
        type_f_ids.add(x)
result = []
for x in z:
    if x['ID'] not in type_f_ids:
        result.append(x)
Как ты видишь, вариант со списковыми выражениями гораздо короче.

set (как и ключи в dictionary) в Питоне не может содержать мутабельные (aka unhashable) типы

Traceback (most recent call last):
File "C:\Documents and Settings\san\Рабочий стол\Python File (10).py", line 8, in <module>
type_f_ids.add(x)
TypeError: unhashable type: 'dict'
[code\]

Отредактировано sanodin (Авг. 26, 2012 09:32:50)

Офлайн

#7 Авг. 26, 2012 09:12:50

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

Помогите с условием

>>> z = [{'ID': '100', 'Type': 'E'}, {'ID': '100', 'Type': 'E'}, {'ID': '100', 'Type': 'F'}, {'ID': '101', 'Type': 'E'}, {'ID': '101', 'Type': 'F'}, {'ID': '103', 'Type': 'F'}, {'ID': '103', 'Type': 'E'}, {'ID': '103', 'Type': 'E'}, {'ID': '110', 'Type': 'E'}, {'ID': '110', 'Type': 'E'}, {'ID': '200', 'Type': 'E'}, {'ID': '200', 'Type': 'E'}, {'ID': '200', 'Type': 'F'}]
>>> 
>>> {d['ID'] for d in z if d['Type'] == 'E'} - \
... {d['ID'] for d in z if d['Type'] == 'F'}
{'110'}
>>>
ещё



Офлайн

#8 Авг. 26, 2012 14:57:54

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Помогите с условием

sanodin, писал прямо в окне ответа. Вот что значит нет легковесной ide с дополнением.

py.user.next, 2.7 или 3.х only.

Отредактировано odnochlen (Авг. 26, 2012 14:58:46)

Офлайн

#9 Авг. 26, 2012 16:41:26

EBFE
Зарегистрирован: 2012-07-03
Сообщения: 99
Репутация: +  20  -
Профиль   Отправить e-mail  

Помогите с условием

odnochlen
sanodin, писал прямо в окне ответа. Вот что значит нет легковесной ide с дополнением.
bpython
iphython ?

Отредактировано EBFE (Авг. 26, 2012 16:42:30)

Прикреплённый файлы:
attachment bpython.png (25,4 KБ)

Офлайн

#10 Авг. 26, 2012 17:19:52

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Помогите с условием

paraman
Если Вас не затруднит, не могли бы вы расписать в пару строчек условие или более.
Без проблем
type_f_ids = set(x['ID'] for x in z
                 if x['Type'] == 'F')
result = [x for x in z
          if x['Type'] == 'E'
          and x['ID'] not in type_f_ids]
А если серьезно, выше уже написали без comprehension и дали ссылки на объяснение, а если нужен только один ID, то решение py.user.next будет лучше.

EBFE
bpython.png
Интересная вещь, оказывается.

Отредактировано reclosedev (Авг. 26, 2012 17:24:38)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version