Python在kwargs中解压缩列表值

时间:2015-09-18 07:23:16

标签: python list

我有这样的词组列表。

RewriteCond %{THE_REQUEST} /(login[^?]*)\?id=[^&\s]+(&\S*)?\s [NC]
RewriteRule ^ /%1%2? [NE,R,L]

如何在方法中解包rows = [ {'user': staff_user, 'grade': [u'0.0', u'N/A', u'N/A', u'N/A', u'N/A']}, {'user': non_staff_user, 'grade': [u'0.0', u'N/A', u'N/A', u'N/A', u'N/A']}, ] for row in rows: expected_row = get_expected_rows(**row) def get_expected_rows(user, grade): #Here i want to list `grade` to be unpacked. dict(zip( ['username', 'email', 'total', 'sub1grade', 'sub2grade', sub3grade, sub4grade], user.username, user.email, grade #I want this unpacked )) ? 想法?

1 个答案:

答案 0 :(得分:1)

你这样做错了。为了在压缩后创建字典,您需要提供两个zip列表,第一个列表是键列表,第二个列表是值列表。您已经创建了密钥列表,现在需要创建值列表。

这是因为dict()函数需要一个迭代,它产生两个元素的元组(或元素或另一个字典的映射),其中第一个元素是键,第二个元素是值。所以这可以通过压缩两个列表中的一个键和另一个值来实现。在压缩时,zip()将从相应的索引中获取元素并生成两个元素的元组。

示例 -

def get_expected_rows(user, grade):
    #Here i want to list `grade` to be unpacked.
    return dict(zip(
        ['username', 'email', 'total', 'sub1grade', 'sub2grade', sub3grade, sub4grade],
        [ user.username, user.email ] + grade))

演示 -

>>> rows = [
... {'user': 'staff_user', 'grade': [u'0.0', u'N/A', u'N/A', u'N/A', u'N/A']},
... {'user': 'non_staff_user', 'grade': [u'0.0', u'N/A', u'N/A', u'N/A', u'N/A']}]
>>> def get_expected_rows(user, grade):
...     #Here i want to list `grade` to be unpacked.
...     return dict(zip(
...         ['username', 'total', 'sub1grade', 'sub2grade', 'sub3grade', 'sub4grade'],
...         [user] + grade
...     ))
...
>>>
>>> for row in rows:
...     expected_row = get_expected_rows(**row)
...     print(expected_row)
...
{'sub1grade': 'N/A', 'sub3grade': 'N/A', 'sub4grade': 'N/A', 'sub2grade': 'N/A', 'username': 'staff_user', 'total': '0.0'}
{'sub1grade': 'N/A', 'sub3grade': 'N/A', 'sub4grade': 'N/A', 'sub2grade': 'N/A', 'username': 'non_staff_user', 'total': '0.0'}

请注意,您的代码中的另一个潜在问题是,行 -

expected_row = get_expected_rows(**row)

您在每次迭代中都会覆盖expected_row,因此在迭代结束时,它只会是最后row的预期行。如果要创建预期行的列表,则应该执行 -

expected_rows = []
for row in rows:    
    expected_rows.append(get_expected_rows(**row))

或列表理解替代 -

expected_rows = [get_expected_rows(**row) for row in rows]