2013-11-25 3 views
0

Я пытаюсь найти дубликаты в массиве, но я хочу игнорировать повторяющиеся нули.Проверка дубликатов в массиве при игнорировании нулей (Python)

Это мой код до сих пор, если кто-нибудь может сказать мне, где я ошибаюсь, что было бы здорово.

массив не имеет дубликатов в ней в этом вопросе, но когда я запускаю его и без дублей она всегда возвращает «Ошибка»

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') 
+1

Каков ожидаемый выход? – thefourtheye

+0

Если есть дубликаты любых чисел, но 0, я хочу, чтобы программа остановилась. Если дубликатов нет, программа продолжается (sudoku solver) – user3029845

+0

'sort' - это список, а' set (sort) '- это набор. Они никогда не будут равными. Кроме того, 'sort' и' set (sort) 'оба будут иметь единственный элемент' num' в них. – user2357112

ответ

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. Затем список сбрасывается до нуля в каждой строке вашей матрицы, и он повторяется.

+0

Я не думаю, что вы должны поднять 'SyntaxError' себя. Что-то вроде 'ValueError' было бы более уместным. –

+0

@WaleedKhan хорошая точка. Я просто выбрал «SyntaxError», потому что я использую его чаще и не уверен во всех других именах ошибок, но да, «ValueError» здесь более уместен. изм. –

+0

Оказывается, я просто случайно забыл отступы что-то. Большое вам спасибо за это, он отлично работает! – user3029845

0

отсортирован (...) возвращает отсортированный список, не может быть равен набору

1.DEF в FUNC, чтобы отфильтровать нули в строке

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

2.check дубликатом в каждой строке

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

3.to проверка дубликатов в нескольких строках, ответ @aIKid работает отлично, спасибо за выправить

+0

Хм, это не ответ. Подождите, пока у вас не будет 50 повторений, тогда прокомментируйте или отправьте правильный ответ. – aIKid

+0

получил его, изменен –

+0

Тем не менее проблема не в длине :) Ему нужно знать, есть ли несколько значений. – aIKid

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

Надеется, что это помогает!

Смежные вопросы