[英]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.