【问题标题】:How to return duplicate elements in list containing sub-list?如何返回包含子列表的列表中的重复元素?
【发布时间】:2018-10-08 17:21:01
【问题描述】:

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

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']

我需要一个通用函数,它返回一个包含重复项的列表。

【问题讨论】:

  • 很酷的东西,伙计。获取编码。向我们展示您的结果。 SO 是关于修复你的代码——而不是实现你的想法。请再次查看how to askon-topic,如果您有任何问题,请将您的代码提供为mvce。如果您遇到错误,请将错误消息逐字(逐字)复制并粘贴到您的问题中。除非您需要传达布局错误,否则请避免使用屏幕截图。我们不能将您的图像复制并粘贴到我们的 IDE 中来修复您的代码。
  • 谷歌“python flatten list”,这将有助于处理嵌套列表。
  • 这应该会有所帮助:stackoverflow.com/questions/2158395/…。将其展平后,通过 Counter 运行它。
  • 您似乎希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只会在发布者已经尝试自己解决问题时提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出以及您实际获得的输出(控制台输出、回溯等)。您提供的详细信息越多,您可能收到的答案就越多。检查FAQHow to Ask
  • @RoryDaulton,如果它伤害了你,我很抱歉,我试过了,但由于缺乏知识,我无法为这个问题创建逻辑。我是python的初学者。

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


【解决方案1】:

如果您将问题表述得更清楚一些,可能会有所帮助。但如果您的列表不太大,您可能需要使用集合:

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))

请注意,构建countriessubsets 的for 循环可能更有效。这取决于像这样的构造函数的潜在加速与使用isinstance 两次的成本。输出也没有排序。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • type(subarray) == type([]) 真的很丑。为什么不isinstance(subarray, list)
    • 这并不能解决第二种情况:返回值不包括China
    • 在此处使用for-loop 或生成器表达式与next 结合使用可能是一个更好的主意。现在您需要构建整个列表来获得第一个匹配项。
    • @Martijn 应该被修复我只选择了第一个元素。
    • @What 不能解决问题:它将返回 [['pakistan' 'india'], ['china', 'pakistan']] 而不是 ['pakistan', 'india', 'china'] 并且还会排除任何潜在的不匹配项。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      相关资源
      最近更新 更多