Найти - Пользователи
Полная версия: Помогите с условием
Начало » Python для новичков » Помогите с условием
1 2
paraman
Люди добрые, помогите. Что-то у меня ступор, не могу придумать условие или действие.
Есть переменная 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'}]

Что-то туплю сильно.
Спасибо, за помощь.
reclosedev
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]
paraman
Спасибо большое за потраченное на мой вопрос время. Но мне как новичку сложно читать сокращённые условия (Условие в строчку).
Если Вас не затруднит, не могли бы вы расписать в пару строчек условие или более.
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)
Как ты видишь, вариант со списковыми выражениями гораздо короче.
sanodin
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\]
py.user.next
>>> 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'}
>>>
ещё
odnochlen
sanodin, писал прямо в окне ответа. Вот что значит нет легковесной ide с дополнением.

py.user.next, 2.7 или 3.х only.
EBFE
odnochlen
sanodin, писал прямо в окне ответа. Вот что значит нет легковесной ide с дополнением.
bpython
iphython ?
reclosedev
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
Интересная вещь, оказывается.
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