列表理解混乱

2024-09-24 06:24:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我对我遇到的一个问题有点困惑,我想知道是否有人能帮上忙(在我看来这是微不足道的,所以我希望这是真的!)你知道吗

基本上,我已经通过以下列表进行了筛选:

depfilt = [s for s in department if 'author' not in s]

(其中department有154个元素,depfilt有72个元素)

现在,我还有一个单独的iD值列表,包含154个元素(subj),这个列表的索引与department中的索引匹配。我想在过滤过程之后保留正确的iD值,因此使用了以下代码行:

subfilt = [s for s in subj if 'author' not in department[subj.index(s)]]

在我看来,我觉得这应该有效,但subfilt实际上返回106个列表元素,而不是72个。你知道吗

有人知道为什么吗?你知道吗

谢谢


Tags: 代码inid元素列表forindexif
2条回答

如果departmentsubj的顺序肯定相同,即每个匹配的对应元素,则使用^{}在两个列表上同时迭代:

[(d, s) for d, s in zip(department, subject) if 'author' not in d]

(部门使用d,主题使用s)。你知道吗

这样就不需要按索引引用每个元素。只是标准的迭代。你知道吗

编辑:如果您想保持列表分开,那么您可以对dept执行第一步,就像您已经做的那样,然后修改主题的第二个循环,这样,在循环两个主题时仍然过滤“author”:

[s for d, s in zip(department, subject) if 'author' not in d]

(因此在第二个循环中d的值被忽略)

输出示例:

>>> 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']

如果值重复,请使用enumerate而不是index

[s for i, s in enumerate(subj) if 'author' not in department[i]]

相关问题 更多 >