преобразование и форматирование списка словарей в Pyton по значениям

#python-3.x #list #function #dictionary #format

Вопрос:

Надеюсь, кто-нибудь сможет помочь мне со словарем:

 data = [  {  "firstname" : "David",  "lastname" : "Brown",  "class" : [ "economy" ]  },  {  "firstname" : "Alina",  "lastname" : "Hoper",  "class" : [ "economy", "business" ]  },  {  "firstname" : "Bill",  "lastname" : "Flow",  "class" : [ "business" ]  },  {  "firstname" : "James",  "lastname" : "Frank",  "class" : [ "economy" ]  } ]  

В качестве вывода мне нужно посмотреть, кто купил эконом-класс, а кто бизнес-класс: С сортировкой = по возрастанию по классу и внутри класса по имени. Так что на первом месте бизнес, а потом экономика. и Алина идет первой в обоих классах, потому что она купила оба класса.

 business: Alina Hoper, Bill Flow, ... economy: Alina Hoper, David Brown, ...  

Я пытался написать функцию, но сейчас не могу понять, с чего начать сортировку и как конвертировать диктофон и группировать данные по классам:

 def analyze(customers_data):  data = ""  data  = "{} {} n".format(customers_data["firstname"], customers_data["lastname"])  data  = "{} n".format(customers_data["aff"])  return data  for d in orders:  print(analyze(d))  

Надеюсь, кто-нибудь сможет помочь

Ответ №1:

Сначала вы должны получить список экономических/бизнес-клиентов, а затем распечатать имена из этих списков:

 data = [  {  "firstname" : "David",  "lastname" : "Brown",  "class" : [ "economy" ]  },  {  "firstname" : "Alina",  "lastname" : "Hoper",  "class" : [ "economy", "business" ]  },  {  "firstname" : "Bill",  "lastname" : "Flow",  "class" : [ "business" ]  },  {  "firstname" : "James",  "lastname" : "Frank",  "class" : [ "economy" ]  } ]  business_custom = [dic for dic in data if "business" in dic["class"]] eco_custom = [dic for dic in data if "economy" in dic["class"]]  business_names = ', '.join(sorted([f"{dic['firstname']} {dic['lastname']}" for dic in business_custom])) economy_names = ', '.join(sorted([f"{dic['firstname']} {dic['lastname']}" for dic in eco_custom]))  print(f"business: {business_names}") print(f"economy: {economy_names}")  

Выход:

 business : Alina Hoper, Bill Flow economy : Alina Hoper, David Brown, James Frank  
Изменить: если вы заранее не знаете имена классов, вы можете создать набор классов:
 class_set = set() for dic in data:  for c in dic['class']:  class_set.add(c)  for c in sorted(list(class_set)):  custom = [dic for dic in data if c in dic["class"]]  names = ', '.join(sorted([f"{dic['firstname']} {dic['lastname']}" for dic in custom]))  print(f"{c}: {names}")  

Комментарии:

1. Большое спасибо. Это помогает. Я также попытался включить сортировку по lastanme, это работает, но не думаю, что это правильно: имена=’,’. join(сортировка([f»{dic[‘имя’]} {dic[‘фамилия’]}» для dic в обычае], ключ=лямбда x: x[6])) gt;gt;gt;gt;gt;gt; он показывает, как я хочу, но если я все понял правильно, он сортируется по 6-му значению (букве). Может быть, у вас есть подсказка, как складывать слова, а не буквы. Я попробовал [‘фамилия’], однако это показывает : строковые индексы должны быть целыми числами

2. вы можете напрямую сортировать своих клиентов по фамилиям, определив custom = [dic for dic in sorted(data, key=lambda x:x['lastname']) if c in dic["class"]] (удалите сортировку, names чтобы впоследствии список не сортировался по имени)