如何 return 复制包含子列表的列表中的元素?
How to return duplicate elements in list containing sub-list?
有一个列表包含如下子列表:
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']
我需要一个通用函数,它 returns 一个包含重复项的列表。
如果您的问题措辞更清楚一些,可能会有所帮助。但是如果你的列表不是太大,你可能想使用集合:
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))
请注意,构建 countries
和 subsets
的 for 循环可能更有效。这取决于像这样的构造函数的潜在加速与使用 isinstance
两次的成本。输出也没有排序。
丑陋但有效 - 不保留顺序,因为 set 是无序数据类型:
lst1 = list(set([j for x in [i for i in counties if isinstance(i, list)] for j in x]))
print(lst1)
Returns:
['pakistan', 'iran', 'india']
由于@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_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
有一个列表包含如下子列表:
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']
我需要一个通用函数,它 returns 一个包含重复项的列表。
如果您的问题措辞更清楚一些,可能会有所帮助。但是如果你的列表不是太大,你可能想使用集合:
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))
请注意,构建 countries
和 subsets
的 for 循环可能更有效。这取决于像这样的构造函数的潜在加速与使用 isinstance
两次的成本。输出也没有排序。
丑陋但有效 - 不保留顺序,因为 set 是无序数据类型:
lst1 = list(set([j for x in [i for i in counties if isinstance(i, list)] for j in x]))
print(lst1)
Returns:
['pakistan', 'iran', 'india']
由于@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_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