簡體   English   中英

python-從帶有子列表的列表創建值字典

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM