#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 символов. Большое вам спасибо 🙂