我有这样的词组列表。
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
))
?
想法?
答案 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]