使用字典键和值筛选 Python 列表

Filter a Python list using Dictionary keys and values

提问人:paaskanama 提问时间:1/14/2023 更新时间:1/14/2023 访问量:57

问:

目标:在 Python 3.8+ 中使用字典作为参考筛选列表列表

案例使用:在查看嵌套列表(一系列调查回复)时,根据控制问题过滤掉回复。在字典中,对问题 3(列表中的索引 2)和问题 7(索引 6)的回答都应为对应值 5。如果响应的两个答案都不是 5,则不应在filtered_responses列表中填充它们。

对如何解决这个问题的解释持开放态度。我已经查看了几个涉及使用列表过滤词典的资源。此方法是首选,因为某些调查响应包含相同的值数组,因此保留了列表元素。

no_of_survey_questions = 10
no_of_participants = 5
min_score = 1
max_score = 10

control_questions = {3: 5,
                     7: 5, }

unfiltered_responses = [[4, 5, 4, 5, 4, 5, 4, 5, 4, 5],  # omit
                        [9, 8, 7, 6, 5, 4, 3, 2, 1, 1],  # omit
                        [5, 5, 5, 5, 5, 5, 5, 5, 5, 5],  # include
                        [5, 2, 5, 2, 5, 2, 5, 9, 1, 1],  # include
                        [1, 2, 5, 1, 2, 1, 2, 1, 2, 1]]  # omit

for response in unfiltered_responses:
    print(response)

print()

filtered_responses = []  # should contain only unfiltered_responses values marked 'include'
for response in filtered_responses:
    # INSERT CODE HERE
    print(response)

提前致谢!

Python 字典 过滤器 嵌套列表

评论

0赞 JonSG 1/14/2023
到目前为止,您尝试过什么?
0赞 paaskanama 1/14/2023
@JonSG太多的尝试列出,但每个 Web 搜索查询都返回“过滤词典”的响应。首先,我试图将每个字典键等同于相应的索引,但无法找到一个有效的解决方案来迭代给定元素的字典。

答:

2赞 Andrej Kesely 1/14/2023 #1

您可以使用列表推导 + :all()

control_questions = {3: 5,
                     7: 5}

unfiltered_responses = [[4, 5, 4, 5, 4, 5, 4, 5, 4, 5],  # omit
                        [9, 8, 7, 6, 5, 4, 3, 2, 1, 1],  # omit
                        [5, 5, 5, 5, 5, 5, 5, 5, 5, 5],  # include
                        [5, 2, 5, 2, 5, 2, 5, 9, 1, 1],  # include
                        [1, 2, 5, 1, 2, 1, 2, 1, 2, 1]]  # omit

filted_questions = [subl  for subl in unfiltered_responses if all(subl[k-1] == v for k, v in control_questions.items())]
print(filted_questions)

指纹:

[
   [5, 5, 5, 5, 5, 5, 5, 5, 5, 5], 
   [5, 2, 5, 2, 5, 2, 5, 9, 1, 1]
]

评论

1赞 paaskanama 1/14/2023
将 subl[k] 稍微修改为 subl[k-1],以将文字字典键与列表索引对齐,看起来这可以工作。谢谢!
1赞 Andrej Kesely 1/14/2023
@paaskanama是的,我粘贴了错误的代码:)固定。subl[k-1]