2016-11-08 1 views
-1

У меня есть файл JSON с информацией о книге. В исходном файле есть больше.Сортировка значения из файла JSON с str.split

Пример:

 [{"author": "Wes McKinney", "price": 53, "title": "Python for Data  Analysis", "publication_year": "2012", "topic": "programming"}, 
     {"author": "Joel Grus", "price": 66, "title": "Data Science from Scratch", "publication_year": "2015", "topic": "Python"}] 

Теперь я хотел бы, чтобы отсортировать информацию, основанную на фамилии автора. я сделал следующее:

names = [] 
for a in jsondata: 
names.append(str.split((a['author']))) 

print (sorted(names)) 

Тогда я получить информацию, как это:

[['Allan', 'Downey'], ['Allan', 'Downey'] 

мне было интересно, если кто-то может дать мне подсказку/наконечник, что использовать, как я могу сортировать всю информацию, основанную по фамилии автора.

ответ

0

Попробуйте это:

names = [] 
for a in jsondata: 
    last_name = a["author"].split(" ")[1] 
    names.append(last_name) 

print(sorted(names)) 

Если вы хотели бы получить отсортированные словари, вы можете сделать это следующим образом:

for a in sorted(jsondata, key=lambda x: x["author"].split(" ")[1]): 
    # You can use dict any way you like. E.g.: 
    print(a["title"] + " " + str(a["price"])) 
+0

Do или нет. Нет «попытки». *** Хороший ответ *** всегда будет объяснять, что было сделано и почему это было сделано таким образом, не только для OP, но и для будущих посетителей SO. –

1

Вы можете отсортировать структуру JSON с помощью sorted() с lambda выражения, как:

lambda x: x["author"].split()[-1] 
# split value of "author", key and sort based on the last word 

Нет необходимости в явном повторении съели над списком и создали еще один список для сохранения имен.

Пример запуск:

>>> my_json = [ 
     {"author": "Wes McKinney", "price": 53, "title": "Python for Data  Analysis", "publication_year": "2012", "topic": "programming"}, 
     {"author": "Joel Grus", "price": 66, "title": "Data Science from Scratch", "publication_year": "2015", "topic": "Python"} 
    ] 

>>> sorted(my_json, key=lambda x: x["author"].split()[-1]) 
[{'topic': 'Python', 'price': 66, 'title': 'Data Science from Scratch', 'publication_year': '2015', 'author': 'Joel Grus'}, {'topic': 'programming', 'price': 53, 'title': 'Python for Data  Analysis', 'publication_year': '2012', 'author': 'Wes McKinney'}] 
0

Вам просто нужно отсортировать jsondata список с соответствующей ключевой функцией, которая извлекает фамилию из значения, связанное с ключом «автор» каждый Dict в.

Я использовал метод .rsplit, чтобы мы могли эффективно обрабатывать сутры, у которых более двух имен. .rsplit(None, 1) разделяет строку на пробел справа, делая (не более) один раскол, возвращая список, содержащий (самое большее) два элемента. Последнее имя будет последним элементом этого списка. Если вы хотите, чтобы фамилия «Guido Van Rossum» была «Van Rossum», вам нужно будет использовать другую стратегию разделения.

import json 

jsondata = [ 
    { 
     "author": "Wes McKinney", "price": 53, 
     "title": "Python for Data  Analysis", 
     "publication_year": "2012", "topic": "programming" 
    }, 
    { 
     "author": "Joel Grus", "price": 66, 
     "title": "Data Science from Scratch", 
     "publication_year": "2015", "topic": "Python" 
    }, 
    { 
     "author": "One", 
    }, 
    { 
     "author": "Person With A Long Name", 
    }, 
] 

def last_name(d): 
    return d["author"].rsplit(None, 1)[-1] 

# Verify that `last_name` does what we want 
for d in jsondata: 
    print(last_name(d)) 

jsondata.sort(key=last_name) 

print(json.dumps(jsondata, indent=4)) 

выход

McKinney 
Grus 
One 
Name 
[ 
    { 
     "title": "Data Science from Scratch", 
     "author": "Joel Grus", 
     "topic": "Python", 
     "publication_year": "2015", 
     "price": 66 
    }, 
    { 
     "title": "Python for Data  Analysis", 
     "author": "Wes McKinney", 
     "topic": "programming", 
     "publication_year": "2012", 
     "price": 53 
    }, 
    { 
     "author": "Person With A Long Name" 
    }, 
    { 
     "author": "One" 
    } 
] 
Смежные вопросы