检查数组中的重复项,同时忽略零(Python)

时间:2013-11-25 03:12:18

标签: python set duplicates

我试图在数组中找到重复但我想忽略重复的零。

这是我的代码到目前为止,如果有人能告诉我哪里出错了那就太棒了。

在这个问题中,数组中没有重复项,但是当我使用和不使用重复项运行它时,它总是返回'Error'

import sys
mat =[[0,5,0,0,0,0,0,0,0],[0,0,0,0,4,0,0,0,3],[0,1,0,0,9,2,6,0,0],[0,0,0,0,2,4,0,8,0],  [0,0,7,0,0,0,0,6,0],[4,0,0,8,1,0,7,0,0],[0,0,1,4,0,7,0,5,6],[0,0,5,0,8,0,0,9,4],[0,0,0,0,0,0,8,0,0]]
def check_duplicate():
    global mat
    for row in mat:
        for num in row:
            if (num != 0):
                ls = [num]
                sort = sorted(ls)
                if (sort != set(sort)):
                    sys.exit('Error')

3 个答案:

答案 0 :(得分:2)

有一种更简单的方法可以做到这一点......只需将所有不为0的数字附加到一个检查列表中,如果要将相同的数字追加两次,则引发错误:

#mat is your matrix
for row in mat:
    hold = []
    for num in row:
        if num in hold:
            raise ValueError("There was an illegal repetition")
        elif num != 0:
            hold.append(num)

基本上这样做是将所有不为0的数字放在列表hold中。但在它输入数字之前,它会检查该数字是否已经在hold中,如果是,则会引发ValueError。然后列表在矩阵的每一行重置为空白并重复。

答案 1 :(得分:0)

排序(...)返回排序列表,不能等于集合

1.def a func来过滤掉行中的零

func = lambda l : [num for num in l if num != 0]

2.检查每行中的副本

for row in map(func, mat):
    if len(row) != len(set(row)):
        #error message

3.检查多行重复,@ aIKID的答案工作正常,感谢纠正

答案 2 :(得分:0)

首先删除所有零,然后检查这些集是否已存在于现有列表中:

def check(l):
    l = [[j for j in i if j != 0] for i in l]
    new = []
    #after throwing all the zeroes:
    for row in l:
        if set(row) in new:
            raise ValueError("There are multiple items")
        else:
            new.append(set(row))

希望这有帮助!