Как вернуть дубликаты элементов в список, содержащий подсписок?
Существует список содержит подсписок, как следует:
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 ответа
Как @Alex упомянул, чтобы узнать о "Flatten list", я придумал решение:
Предположим, что есть список списков или список, содержащий подсписки:
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(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
Это может помочь, если вы сформулируете свой вопрос немного более четко. Но если ваши списки не слишком велики, вы можете использовать наборы:
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
дважды. Вывод также не отсортирован.
Ужасно, но работает - не сохраняет порядок, потому что 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']