如何在包含子列表的列表中返回重复元素?

时间:2018-04-27 20:06:04

标签: python python-3.x list duplicates sublist

有一个列表包含如下子列表:

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 :(得分:1)

如果你更清楚地表达你的问题,这可能会有所帮助。但是如果你的列表不是太大,你可能想要使用集合:

class Contract {

// constructor
constructor() {

    // dynamic data
    this.str = '';
    this.count = 0; 
}

// update function
update(_value){
    this.str = _value;
    this.count++; 
   }
}

请注意,构建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的for循环可能更有效。这取决于像这样的构造函数的潜在加速与使用subsets两次的成本。输出也没有排序。

答案 1 :(得分:0)

丑陋但有效 - 不保留顺序,因为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']

答案 2 :(得分:0)

正如@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