[英]python - create dictionary of values from list with sub-lists
我想創建一個具有以下輸出的json輸出:
[ {'data': [<val1>,<valn>], 'name': '<nameA>'},
{'data': [<val1>,<valn>], 'name': '<nameB>'} ]
基本上,它接受一個由子列表組成的列表,並且對於每個子列表的第一個元素,其值將歸於屬性“名稱”,其余的將在屬性“數據”中形成一個列表。
下面的代碼創建所需的輸出,但是僅在項目列表中的每個子列表具有2個元素時才起作用。
items= [['A', 30.0], ['B', 10.0], ['C', 9.28]]
print "ITEMS before==",items
items = [{"name":k, "data":[g]} for k,g in items]
print "ITEMS after==",items
正確的輸出: [{'data':[30.0],'name':'A'},{'data':[10.0],'name':'B'},{'data':[9.28],'名稱':'C'}]
問題是當子列表具有兩個以上的元素時,例如:
items= [['A', 1 ,30.0], ['B', 2, 10.0], ['C', 3, 9.28]]
應該產生:
[{'data': [1,30.0], 'name': 'A'}, {'data': [2,10.0], 'name': 'B'}, {'data': [3,9.28], 'name': 'C'}]
我已經嘗試過類似的東西:
items = [{"name":k, "data":[ x[1:] for x in g] } for k,g in items]
但它會產生一個錯誤: ValueError:太多的值無法解包
如何增加所需的輸出?
嘗試這個:
[{'name': x[0], 'data': x[1:]} for x in my_list]
如果您使用的是Python 2.7或3.x,則可以使用綜合來創建字典和列表。 [1:]
切片為您提供了第一個元素開始的列表。
您的問題是,通過編寫不需要的內容( [x[1:] for x in g]
),您正在重復創建列表的工作。 切片已經返回一個列表,並且如果g不是列表,則此列表(如您所見)將失敗。
由於x[1:]
如果在兩個元素的列表上調用,將返回一個元素列表,因此只要您的列表至少兩個,並且第一個值始終是“名稱”鍵,則此方法將起作用。 觀察:
>>> my_list = [['A', 1 ,30.0], ['B', 2, 10.0], ['C', 3, 9.28]]
>>> [{'name': x[0], 'data': x[1:]} for x in my_list]
[{'data': [1, 30.0], 'name': 'A'}, {'data': [2, 10.0], 'name': 'B'}, {'data': [3, 9.28], 'name': 'C'}]
>>> my_list = [['A', 1 ,30.0], ['B', 2, 10.0], ['C', 3]]
>>> [{'name': x[0], 'data': x[1:]} for x in my_list]
[{'data': [1, 30.0], 'name': 'A'}, {'data': [2, 10.0], 'name': 'B'}, {'data': [3], 'name': 'C'}]
如果您知道第一個項目將始終是鍵,則此列表理解將完成工作: new_dict = [{"name":k[0], "data":k[1:]} for k in items]
之所以會得到“要解包的值太多”的原因是,您擁有的值比擁有的變量多。 Python不知道將剩余的變量分配給g
。 如果items
數組每個子數組始終具有三個元素,則可以創建一個非常具體的理解,例如: new_dict = [{"name":k, "data":[g,d]} for k,g,d in items]
。 但是到目前為止,第一次理解是更加通用的。
盡管其他人提供的方法適用於python 2.x和3.x,但是如果您使用的是3.x(不是通過打印語句判斷),則可以使用更簡單的方法使用相同的語法您正在使用:
res = [{"name": k, "data": g} for k, *g in items]
基本上是這樣說的:“將第一個值放入k
,其余的放入g
。但是,同樣,這僅在python 3.x中可用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.