[英]Python unpacking list value in kwargs
我有这样的字典列表。
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
))
如何使用该方法解开grade
? 想法?
您做错了。 为了在压缩后创建字典,您需要提供两个要压缩的列表,第一个列表是键的列表,第二个列表是值的列表。 您已经创建了键列表,现在需要创建值列表。
这是因为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
在每次迭代中覆盖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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.