簡體   English   中英

刪除字典中的鍵並將值存儲在列表的字典中

[英]Remove Keys in Dictionary and Store Values in a Dictionary of Lists

因此,我有一本帶有“項目”的字典,其中包含字典列表。 我正在嘗試將其重組為“項”的字典,該字典具有包含上一本字典鍵的值的列表列表。

原版的:

data = { 
   "items": [ 
           { "A": 0.00, "B": 33.27, "C": "string", "D": "16122 " }, 
           { "A": 0.00, "B": 5176.66, "C": "string", "D": "21216 " } 
            ] 
       }

我想得到什么:

data = { 
    "items": [ 
           [ 0.00, 33.27, "string", "16122 " ], 
           [ 0.00, 5176.66, "string", "21216 " ] 
             ] 
         }

似乎operator.itemgetter幾乎是您想要的:

getter = operator.itemgetter('A', 'B', 'C', 'D')
data = {'items': [getter(dct) for dct in data['items']]}

在這種情況下,你最終有一個listtuple ,而不是一個listlist ,但在許多應用中,這可能是確定。

演示:

>>> data = { 
...    "items": [ 
...            { "A": 0.00, "B": 2184.83, "C": "string", "D": "16122 " }, 
...            { "A": 0.00, "B": 5176.66, "C": "string", "D": "21216 " } 
...             ] 
...        }
>>> import operator
>>> getter = operator.itemgetter('A', 'B', 'C', 'D')
>>> data = {'items': [getter(dct) for dct in data['items']]}
>>> data['items'][0]
(0.0, 2184.83, 'string', '16122 ')
>>> data['items'][1]
(0.0, 5176.66, 'string', '21216 ')

這是一種完全按照您想要的方式進行操作的方法。

#Get the column names from the first record
colNames =data['items'][0].keys()
#Get values from all records that have the same keys as in the first record
newData = { 'items' : [[record[colName] for colName in colNames] \
                   for record in data['items']] }
print newData

輸出:

{'items': [[0.0, 'string', 33.27, '16122 '], [0.0, 'string', 5176.66, '21216 ']]}

請記住,字典是無序的-因此,當映射到列表時,需要指定鍵的順序以獲得值的相關順序。 鍵的順序不一定是聲明的順序,上次查看的順序等等。

因此,更實際的示例數據是:

data = { 
   "items": [ 
           { "D": "16122 ", "A": 0.00, "B": 33.27, "C": "string" }, 
           { "B": 5176.66, "A": 0.00,  "D": "21216 ", "C": "string" } 
            ] 
       }

要將無序鍵映射到有序列表,您需要選擇要使用的順序。 假設您按照以下順序排列順序:

ordered_keys=("A", "B", "C", "D")    

然后,您可以通過簡單的循環轉換為結構:

for k, LoD in data.items():      # consider '.iteritems() on Py 2 and larger dicts...
    data[k]=[[di[sk] for sk in ordered_keys] for di in LoD]

>>> data
{'items': [[0.0, 33.27, 'string', '16122 '], [0.0, 5176.66, 'string', '21216 ']]}

現在,您需要決定如何處理字典列表中可能缺少的鍵。 除非每個字典具有完全相同的鍵,否則您需要一個默認值。

這是您可以執行此操作的方法:

data = { 
   "items": [ 
           { "D": "16122 ", "A": 0.00, "B": 33.27, "C": "string" }, 
           { "B": 5176.66, "A": 0.00,  "D": "21216 ", "C": "string" }, 
           {  "E": "New Key ", "C": "'A' and 'B' are missing in this dict" } 
            ] 
       }

for k, LoD in data.items():     
    keys=sorted({e for sk in LoD for e in sk})
    data[k]=[keys]+[[di.get(sk, None) for sk in keys] for di in LoD]

在這種情況下,字典列表中的所有鍵均被收集,排序,然后成為列表列表中的第一個元素(因此您知道哪個data鍵和其他data鍵可能具有不同的鍵集。):

data = { 
   "items": [ 
           { "D": "16122 ", "A": 0.00, "B": 33.27, "C": "string" }, 
           { "B": 5176.66, "A": 0.00,  "D": "21216 ", "C": "string" }, 
           {  "E": "New Key ", "C": "'A' and 'B' are missing in this dict" } 
            ],
    "More": [
           { "D": "16122 ", "A": 0.00, "B": 33.27, "C": "string" }
            ]             
       }

for k, LoD in data.items():     
    keys=sorted({e for sk in LoD for e in sk})
    data[k]=[keys]+[[di.get(sk, None) for sk in keys] for di in LoD]

結果:

>>> for k in data:
...     print k+':'+'\n\t'+'\n\t'.join(repr(e) for e in data[k])
items:
    ['A', 'B', 'C', 'D', 'E']
    [0.0, 33.27, 'string', '16122 ', None]
    [0.0, 5176.66, 'string', '21216 ', None]
    [None, None, "'A' and 'B' are missing in this dict", None, 'New Key ']
More:
    ['A', 'B', 'C', 'D']
    [0.0, 33.27, 'string', '16122 ']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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