Удаление дубликатов из списка динамических объектов

#python #list #for-loop

#питон #Список #для-петли

Вопрос:

Цель: удалить дубликаты из одного и того же самого глубокого вложенного списка. Оставь себе других.

Список содержит несколько: dict -gt; dict -gt; list

Однако другой подсписок может содержать то же самое предложение, что и другой подсписок. Их нужно сохранить.

set() кажется идеальным, но я хочу, чтобы это применялось к самым глубоким подспискам. Не на my_list объекте. Эта структура может изменяться и иметь более глубокие dicts и lists разные прогоны.


Код:

У меня было много вариантов этого, но на самом деле my_list может быть любая структура.

Возможно ли то, что я хочу, если структура может быть другой?

 my_list = # ...  for ele in my_list:  if isinstance(ele, list):  ele = list(set(ele))  elif: isinstance(ele, dict):    

my_list :

например 1st PDF -gt; ECON -gt; awards , и 1st PDF -gt; ECON -gt; security содержат одни и те же дубликаты.

 [  {  "../data/gri/reports/GPIC_Sustainability_Report_2020__-_40_Years_of_Sustainable_Success.pdf": {  "COMP": {  "Behaviour": [  "we focus apply measures four elements safety culture systems processes skills knowledge individuals behaviours attitudes perception leadership"  ]  },  "ECON": {  "subsidies": [  "meanwhile main recent regulatory impact business significant phasing subsidies gas electricity prices expected continue next years well nationwide strategy allocates natural gas conservatively"  ],  "awards": [  "ensure robust security 100 readiness times participate international awards rospa bsc awards",  "ensure robust security 100 readiness times participate international awards rospa bsc awards"  ],  "security": [  "ensure robust security 100 readiness times participate international awards rospa bsc awards",  "ensure robust security 100 readiness times participate international awards rospa bsc awards"  ]  }  }  },  {  "../data/gri/reports/GRI_2018_Report.pdf": {  "COMP": { ...  

Желаемый список:

 [  {  "../data/gri/reports/GPIC_Sustainability_Report_2020__-_40_Years_of_Sustainable_Success.pdf": {  "COMP": {  "Behaviour": [  "we focus apply measures four elements safety culture systems processes skills knowledge individuals behaviours attitudes perception leadership"  ]  },  "ECON": {  "subsidies": [  "meanwhile main recent regulatory impact business significant phasing subsidies gas electricity prices expected continue next years well nationwide strategy allocates natural gas conservatively"  ],  "awards": [  "ensure robust security 100 readiness times participate international awards rospa bsc awards"  ],  "security": [  "ensure robust security 100 readiness times participate international awards rospa bsc awards"  ]  }  }  },  {  "../data/gri/reports/GRI_2018_Report.pdf": {  "COMP": { ...  

Пожалуйста, дайте мне знать, если я должен уточнить что-нибудь еще.

Ответ №1:

Итак ,похоже, что единственные дубликаты, которые вас волнуют, — это когда у вас есть список строк. Мы можем сделать некоторые предположения:

  • Это только JSON (списки, диктанты, строки и примитивы)
  • Если мы не сможем хэшировать объект, то он не может быть дубликатом
  • Порядок выведенных списков не имеет значения

Итак, давайте использовать рекурсию.

 def dedup(obj):  if isinstance(obj, list):  try:  # We try to dedupe as if everything is hashable,  # but this will fail for a list of dicts, so fallback  # in that case.  return list({dedup(x) for x in obj})  except TypeError:  return [dedup(x) for x in obj]  elif isinstance(obj, dict):  return {k: dedup(v) for k, v in obj.items()}  else:  # this is some kind of primitive (str/int/float/bool/None)  return obj  

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

1. Эти предположения верны. Я попробую это сделать и доложу об этом. Спасибо

2. Моя правка должна была состоять не менее чем из 6 символов. Большое вам спасибо 🙂