Python - 为什么这个列表理解会返回一个空列表?

时间:2017-06-19 11:04:50

标签: python list-comprehension

我有一个任务列表,我正在尝试选择具有给定ID的所有任务。

# temp global tasks list
tasks = [
    {
        'id': 1,
        'title': u'Buy groceries',
        'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
        'done': False
    },
    {
        'id': 2,
        'title': u'Learn Python',
        'description': u'Need to find a good Python tutorial on the web',
        'done': False
    }
]

# here I try to select some tasks. 'request.args.get('id')' is 2 in my test
selectedTasks = tasks

if 'id' in request.args:
    selectedTasks = [task for task in selectedTasks if task['id'] == request.args.get('id')]

如果我执行此操作,selectedTasks为空。但是我不明白为什么。

我尝试打印一些值:

# just before the list comprehension
print(selectedTasks, file=sys.stderr)
print(request.args.get('id'), file=sys.stderr)
print(selectedTasks[1]['id'], file=sys.stderr)

打印:

[{'id': 1, 'title': 'Buy groceries', 'description': 'Milk, Cheese, Pizza, Fruit, Tylenol', 'done': False}, {'id': 2, 'title': 'Learn Python', 'description': 'Need to find a good Python tutorial on the web', 'done': False}]
2
2

所以任务都在那里,request.args.get('id')是正确的,第二个任务有id 2。那么为什么这不起作用呢?

2 个答案:

答案 0 :(得分:2)

request.args中,id是一个字符串,在中,2 等于'2'

>>> 2 == '2'
False

所以我们可以简单地将字符串转换为int(..),然后解决它:

if 'id' in request.args:
    the_id = int(request.args.get('id'))
    selectedTasks = [task for task in selectedTasks if task['id'] == the_id]

或者,您可以 - 就像您自己说的那样 - 为type方法提供.get()参数,以便在.get()级别进行转换:

if 'id' in request.args:
    the_id = request.args.get('id',type=int)
    selectedTasks = [task for task in selectedTasks if task['id'] == the_id]

答案 1 :(得分:1)

您没有指定用于提供请求对象的框架,但request.args很可能会返回字符串列表。您应该尝试将请求参数转换为int。

 <div class="item">
    <p:outputLabel for="firstName" value="#{msgs['customerForm.firstName']}"/>
    <p:inputText id="firstName" value="#{customerBean.customer.firstName}"
    requiredMessage="#{msgs['Error.firstName.mandatory']}"
    validatorMessage="#{msgs['Error.firstName.wrongFormat']}"required="true">
    <f:validateRegex pattern="^([a-zA-Z]+[a-zA-Z\s\-]*){1,255}$" />
    </p:inputText>
    <p:message id="m_firstName" for="firstName" display="text"/>
</div>