基于满足条件的字典中的值创建列表

Giv*_* IT 0 python dictionary for-loop list

我有这个词典,我想用Id编制一个列表..如果他们的hasCategory是True.

categories = [{'Id': 1350, 'hasCategory': True},
              {'Id': 113563, 'hasCategory': True},
              {'Id': 328422, 'hasCategory': False}]
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我的结果列表应该是这个

list = [1350, 113563]
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用上面的代码

list =[]    
for item in categories:
    if item.hasCategory is True:
        list.push(item.Id) 
Run Code Online (Sandbox Code Playgroud)

但是当我试图运行我的应用程序时,我遇到了错误

for item in categories
                       ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

the*_*eye 8

代码中发现的基本问题

  1. 实际上你需要用来:标记结尾iffor语句,就像这样

  2. 不要使用任何内置名称作为变量名称.在这种情况下,list.

  3. 要从字典中获取值,您只需要使用["key"]方法获取它.点符号不起作用.


所以你的固定代码看起来像这样

result = []                      # list is a built-in name. Don't use that
for item in categories:          # : at the end
    if item["hasCategory"]:      # : at the end
        result.push(item["Id"])
Run Code Online (Sandbox Code Playgroud)

除此之外,用于检查变量是否为Truthy的Pythonic方法就是

if expression:
Run Code Online (Sandbox Code Playgroud)

这就是为什么我们不检查

if item["hasCategory"] == True:
Run Code Online (Sandbox Code Playgroud)

要么

if item["hasCategory"] is True:    # Never use `is` to compare values
Run Code Online (Sandbox Code Playgroud)

引用PEP-8,Python代码风格指南,

不要将布尔值与之比较TrueFalse使用==.

Yes:   if greeting:
No:    if greeting == True:
Worse: if greeting is True:
Run Code Online (Sandbox Code Playgroud)

解决此问题的最佳方法是使用列表理解和过滤条件,如下所示

>>> [item["Id"] for item in categories if item["hasCategory"]]
[1350, 113563]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它将根据您的旧迭代创建一个新列表categories.