2016-05-18 3 views
0

У меня есть данные в JSON объекта с key:value, как показано ниже в Python. Есть две записи, имеющие одинаковую ID для Хари и для Лиз.Python - Преобразование данных объекта JSON в список

from collections import defaultdict 
from itertools import * 
from operator import itemgetter 

data = [ 
    { 
    "fname": "Abc", 
    "lname": "xyz", 
    "id": 15, 
    "club": "-", 
    "date": "-" 
    }, 
    { 
    "fname": "Hari", 
    "lname": "Lee", 
    "id": 13, 
    "club": "Manutd", 
    "date": "2016-03-20T22:00:00.000Z" 
    }, 
    { 
    "fname": "David", 
    "lname": "James", 
    "id": 14, 
    "club": "Barca", 
    "date": "-" 
    }, 
    { 
    "fname": "Hari", 
    "lname": "Lee", 
    "id": 13, 
    "club": "Chelsea", 
    "date": "2012-03-20T22:00:00.000Z" 
    }, 
    { 
    "fname": "Liz", 
    "lname": "Kiz", 
    "id": 16, 
    "club": "-", 
    "date": "-" 
    }, 
    { 
    "fname": "Liz", 
    "lname": "Kiz", 
    "id": 16, 
    "club": "Falkon", 
    "date": "2014-03-20T22:00:00.000Z" 
    } 
] 

newdata = [] 
#for item, value in enumerate(data): 
    #for i,v in value.iteritems(): 
    #print value['id'] 
    #print value[i] 
    #print i,v 
    #newdata.append() 

Я хочу, чтобы переформатировать данные JSON в список без ключа и слияния дублируется ID в виде списка списка. Запись с такими же ID's будет отображена в список списка, как показано ниже. Как я могу это достичь?

newdata = [[["Hari", "Lee", "Manutd", "2016-03-20T22:00:00.000Z"], ["Hari", "Lee", "Chelsea", "2012-03-20T22:00:00.000Z"]], 
    ["David", "James", "Barca", "-"], ["Abc", "xyz", "-" "-"], [["Liz", "Kiz", "-", "-"], ["Liz", "Kiz", "Falkon", "2014-03-20T22:00:00.000Z"]]] 

Iterate над новыми данными списка и записи каждого списка данных в виде строки в Excel (xlwt файл)

for i1, v1 in enumerate(newdata): 
    for i2,v2 in enumerate(v1): 
    if(type(v2) is str): 
     print v2 
    else: 
     for i3,v3 in enumerate(v2): 
     print v3 

ответ

2

Чтобы проверить тот же идентификатор, что нужно хранить данные в dict

ret_dict = {} 

Но dict не заказывается. Если вы хотите провести свой заказ, вы можете вы OrderedDict

from collections import OrderedDict 
ret_dict = OrderedDict() 
for element in data: 
    # To remove 'id' from the dict 'element' use element.pop('id') 
    # element.pop('id') return the value of id 
    ret_dict.setdefault(element.pop('id'), []).append(element.values()) 

Для меня ret_dict.values() это уже хороший результат:

>>> print ret_dict.values() 
[[['xyz', '-', '-', 'Abc']], [['Lee', 'Manutd', '2016-03-20T22:00:00.000Z', 'Hari'], ['Lee', 'Chelsea', '2012-03-20T22:00:00.000Z', 'Hari']], [['James', 'Barca', '-', 'David']], [['Kiz', '-', '-', 'Liz'], ['Kiz', 'Falkon', '2014-03-20T22:00:00.000Z', 'Liz']]] 

Но именно то, что вы хотите, вы должны создать новый список из values последнего Dict:

ret_list = [e[0] if len(e) == 1 else e for e in ret_dict.itervalues()] 

itervalues(), чтобы получить итератор значений вместо списка, как values()
Выход:

>>> print ret_list 
[['xyz', '-', '-', 'Abc'], [['Lee', 'Manutd', '2016-03-20T22:00:00.000Z', 'Hari'], ['Lee', 'Chelsea', '2012-03-20T22:00:00.000Z', 'Hari']], ['James', 'Barca', '-', 'David'], [['Kiz', '-', '-', 'Liz'], ['Kiz', 'Falkon', '2014-03-20T22:00:00.000Z', 'Liz']]] 
+0

Ты герой! Благодаря! – MysticCodes

+0

Как добавить значения элементов в порядок и удалить значение «id» из списка? – MysticCodes

+0

Обычный 'dict' не заказывается. Вы должны использовать 'OrderedDict' для добавления значений элементов в порядок. Чтобы удалить ** id ** из 'dict' или' OrderedDict', вы можете использовать 'pop'. Я обновил свой ответ. – qvpham

Смежные вопросы