【问题标题】:How to determine if all elements in a nested list are unique?如何确定嵌套列表中的所有元素是否都是唯一的?
【发布时间】:2020-07-11 03:44:08
【问题描述】:

我是这里的初学者,真的需要一些帮助。

我必须确定二维列表中的所有元素是否都是唯一的。例如,如果给定一个二维列表my_list = [[1,2,2],[4,5,2],[7,2,9]],我必须编写一个代码,说“这个列表没有所有唯一元素”,因为有多个 2。我必须使用嵌套循环编写代码。

这是我目前所拥有的:

my_list = [[1,2,2],[4,5,2],[7,2,9]]             
for row in my_list:
    for num in row:    
        if row.count(num) > 1:
            print("Duplicate")
        else:
            print("No duplicate", num)

此代码可以检测到 my_list 的第一个列表中的重复 2,但不能检测到第二个列表。

【问题讨论】:

  • 如何在不将嵌套列表转换为一个列表并使用嵌套循环的情况下编写此代码?
  • 这是因为 row1 和 row2 没有重复。所以它打印“无重复”。第 0 行有重复项。

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


【解决方案1】:

要在不先展平列表列表的情况下做到这一点,您可以使用一个跟踪已“看到”的项目的集合,这样您就可以确定迭代中的当前项目有重复已经在集合中:

seen = set()
for sublist in my_list:
    for item in sublist:
        if item in seen:
            print('Duplicate')
            break
        seen.add(item)
    else:
        continue
    break
else:
    print('No duplicate')

【讨论】:

  • 注意:这种方法比我的字典方法好。+1
【解决方案2】:

您需要展平列表并查找重复项。您可以使用 itertools.chain.from_iterable 来展平列表列表

from itertools import chain
my_list = [[1,2,2],[4,5,2],[7,2,9]] 
flat=list(chain.from_iterable(my_list)
if len(flat)==len(set(flat)):
    print('No dups')
else:
    print('Dups found')

编辑:使用 for 循环而不展平

count={}
dups=False
for lst in my_list:
    for k in lst:
        count[k]=count.setdefault(k,0)+1
        if count[k]>1:
            dups=True
            break
    if dups:
        print("dups found")
        break
else:
    print('No dups')

【讨论】:

  • 感谢 Ch3steR,有没有什么方法可以在不展平列表的情况下编写此代码并改用嵌套循环?
【解决方案3】:

如果您需要一个函数来检查二维数组/列表是否有重复的嵌套循环:

def two_dim_list_has_duplicates(my_list):
    unique = set()
    for item in my_list:
        for i in item:
            if i in unique:
                return True
            seen.add(item)
    return False

【讨论】:

    【解决方案4】:

    首先,收集一个列表中的所有元素:

    all_elements = [y for x in liste for y in x]
    

    检查所有元素是否唯一:

    len(all_elements) == len(set(all_elements))
    

    对于非唯一元素的列表:

    list(set([x for x in all_elements if all_elements.count(x)!=1]))
    

    但是如果你坚持使用嵌套循环,你仍然需要为这个检查保留一个唯一的列表。示例:

    my_list = [[1,2,2],[4,5,2],[7,2,9]]
    uniques = []
    for row in my_list:
        for num in row:    
            if num in uniques:
                print("Duplicate",num)
            else:
                print("No duplicate", num)
            uniques.append(num)
    

    输出:

    No duplicate 1
    No duplicate 2
    Duplicate 2
    No duplicate 4
    No duplicate 5
    Duplicate 2
    No duplicate 7
    Duplicate 2
    No duplicate 9
    

    【讨论】:

    • 感谢 Yusuf,有没有什么方法可以在不转换为单列表的情况下使用嵌套循环来编写此代码?
    猜你喜欢
    • 2023-02-21
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 2013-08-20
    • 1970-01-01
    • 2019-12-22
    • 2015-10-03
    相关资源
    最近更新 更多