2014-10-02 4 views
0

Итак, у меня есть словарь с «элементами», который содержит список словарей. Я пытаюсь перестроить его как словарь «элементов», который имеет список списков, содержащих значения ключей предыдущего словаря.Удалить ключи в словаре и сохранить значения в словаре списков

Оригинал:

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 " ] 
      ] 
     } 
+0

Где эти данные в вашем втором примере? В вашем первом примере нет 33.27 или «Deep Creek Restaurant» и т. Д. – BrenBarn

+0

Извините, это была ошибка моего редактирования. Я хотел удалить все конкретные данные. – goopcat

+0

Являются ли ключи в списке dicts ВСЕГДА такими же? Если есть разные ключи, вам нужно иметь соглашение о том, как вы справитесь с этим. – dawg

ответ

3

Похоже operator.itemgetter почти то, что вы хотите:

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

В этом случае вы в конечном итоге с a list от tuple, а не list от list, но во многих приложениях это, вероятно, хорошо.

Демо:

>>> 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 ') 
0

Вот один из способов сделать именно так, как вы хотели.

#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 ']]} 
0

Имейте в виду, что dicts неупорядоченные - поэтому вам необходимо указать порядок ключей, чтобы получить корреляционную порядок значений при отображении к список. Порядок ключей не обязательно будет порядком, в котором они объявлены, порядке они были в последний раз, когда вы смотрели, и т.д.

Так более реалистичный пример данные:

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

Для отображения неупорядоченных ключей в упорядоченный список, вам нужно выбрать, какой заказ вы будете использовать. Предположу, вы оседать по символьной BETICAL порядка, как и порядок:

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 ']]} 

Теперь вы должны решить, что делать с ключами, которые могут в списке dicts отсутствует. Если каждый dict имеет точно такие же ключи, вам нужно значение по умолчанию.

Вот так, как вы могли бы сделать это:

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] 

В этом случае все ключи в списке dicts собраны, сортируются, а затем сделал первый элемент в списке списков (так что вы знаю, что есть что и другие ключи от 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 '] 
Смежные вопросы