Путаница в понимании списка

#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. Если вы выполняете дальнейшую фильтрацию , то вместо двух отдельных циклов выполняйте их вместе в соответствии с моим исходным циклом. Таким образом, каждый набор отфильтрованных элементов группируется в кортеж, который вы можете выделить позже, если захотите. И вам не пришлось бы повторять условия фильтрации в разных циклах (подверженных ошибкам и «СУХИХ» ).