Как вернуть дубликаты элементов в список, содержащий подсписок? - PullRequest
0 голосов
/ 27 апреля 2018

Существует список, содержащий подсписок, подобный следующему:

country_list = ['pakistan', 'india', 'iran', 'china', 'afghanistan', ['pakistan', 'iran', 'india']]

Вывод должен быть: ['pakistan', 'india', 'iran']

В основном списке может быть несколько подсписков, например:

countries = ['pakistan', 'india', 'iran', 'china', 'afghanistan', ['pakistan', 'india'], ['china', 'pakistan']]

Вывод должен быть: ['pakistan', 'india', 'china']

Мне нужна универсальная функция, которая возвращает список, содержащий дубликаты.

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Ужасно, но работает - не сохраняет порядок, потому что set является неупорядоченным типом данных:

lst1 = list(set([j for x in [i for i in counties if isinstance(i, list)] for j in x]))
print(lst1)

Возвращает:

['pakistan', 'iran', 'india']
0 голосов
/ 28 апреля 2018

Когда @Alex упомянул о «Сведенном списке», я нашел решение:

Предположим, что есть список списков или список, содержащий подсписки:

import collections
countries = ['pakistan', 'india', 'iran', 'china', 'afghanistan', ['pakistan', 'india'], ['china', 'pakistan']]

def flatten_list(c_list):
"""
function to convert list of lists into flat list.
"""
  result = []
  for country in c_list:
      if isinstance(country, collections.Iterable) and not isinstance(country, (str, bytes)):
          result.extend(flatten_list(country))
      else:
          result.append(country)
  return result

def list_of_duplicates(flat_list):
"""
function to get duplicate entries and removing single entries
"""

    new_list = flat_list
    for e in set(new_list):
        new_list.remove(e)
    return list(set(new_list))


  result = list_of_duplicates(flatten_list(countries)) #desired result
0 голосов
/ 27 апреля 2018

Это может помочь, если вы сформулируете свой вопрос немного яснее. Но если ваши списки не слишком велики, вы можете использовать наборы:

countries = frozenset(x for x in country_list if isinstance(x, str))
subsets = frozenset.union(*(frozenset(x) for x in country_list if not isinstance(x, str)))
output = list(countries.intersection(subsets))

Обратите внимание, что в этом случае цикл for для построения countries и subsets может быть более эффективным. Это зависит от потенциального ускорения работы таких конструкторов в сравнении с затратами на использование isinstance в два раза. Вывод также не отсортирован.

...