#python
#python
Вопрос:
Я немного смущен проблемой, с которой я столкнулся, и задавался вопросом, может ли кто-нибудь помочь (на мой взгляд, это кажется тривиальным, поэтому я надеюсь, что это действительно так!)
По сути, я отфильтровал список с помощью следующего понимания списка:
depfilt = [s for s in department if 'author' not in s]
(где в отделе было 154 элемента, а результирующий depfilt имеет 72 элемента)
Теперь у меня также был отдельный список значений идентификаторов со 154 элементами ( subj
), для которых индексы этого списка совпадают с department
индексами. Я хотел сохранить правильные значения идентификаторов после процесса фильтрации, поэтому использовал следующую строку кода:
subfilt = [s for s in subj if 'author' not in department[subj.index(s)]]
На мой взгляд, я чувствую, что это должно было сработать, но subfilt фактически возвращает 106 элементов списка, а не 72.
У кого-нибудь есть идеи, почему?
Спасибо
Ответ №1:
Использовать enumerate
вместо index
в случае повторяющихся значений
[s for i, s in enumerate(subj) if 'author' not in department[i]]
Ответ №2:
Если department
и subj
, безусловно, в том же порядке, то есть. соответствующие элементы каждого совпадают, затем используются zip
для одновременного перебора обоих списков:
[(d, s) for d, s in zip(department, subject) if 'author' not in d]
(используется d
для отдела и s
для предмета).
И таким образом вам не нужно ссылаться на каждый элемент по индексу. Просто стандартная итерация.
Редактировать: если вы хотите сохранить отдельные списки, вы можете сделать первый шаг dept
, как у вас уже есть, а затем изменить второй цикл для темы таким образом, продолжая фильтровать по «автору» при циклическом просмотре обоих:
[s for d, s in zip(department, subject) if 'author' not in d]
(таким образом, значение d
игнорируется во 2-м цикле)
Пример вывода:
>>> department = ['something', 'else', 'author', 'okay']
>>> subject = ['some_subj', 'else_subj', 'author_subj', 'okay_subj']
>>> [(d, s) for d, s in zip(department, subject) if 'author' not in d]
[('something', 'some_subj'), ('else', 'else_subj'), ('okay', 'okay_subj')]
>>>
>>> # and if you MUST do them seprately:
... [s for s in department if 'author' not in s] # that's your `deepfilt`
['something', 'else', 'okay']
>>> [s for d, s in zip(department, subject) if 'author' not in d] # this is for `subfilt`
['some_subj', 'else_subj', 'okay_subj']
Комментарии:
1. Каким будет результат этого, будут ли списки оставаться отдельными?
2. Результатом этого будет получение списка с кортежем для
d
иs
в паре.3. Я думаю, что проблема с этим методом для меня заключается в том, что мне нужно выполнить дальнейшую фильтрацию списков, или это относительно просто сделать?
4. Отредактировал мой ответ, чтобы вы по-прежнему получали два отдельных списка. Используйте свой оригинальный первый цикл и отредактированный второй цикл.
5. Если вы выполняете дальнейшую фильтрацию , то вместо двух отдельных циклов выполняйте их вместе в соответствии с моим исходным циклом. Таким образом, каждый набор отфильтрованных элементов группируется в кортеж, который вы можете выделить позже, если захотите. И вам не пришлось бы повторять условия фильтрации в разных циклах (подверженных ошибкам и «СУХИХ» ).