2015-12-14 2 views
1

дали матрицу NxN списков, как я могу определить, что все элементы в списке являются уникальными примера:как проверить все элементы в списке/матрицах различны в питоне

(check_unique_elem([[8, 3, 4], [1, 5, 9], [6, 7, 2]])) 
example output: 
True 
(check_unique_elem([[1]])) 
True 
(check_unique_elem([[2,3],[6,5],[6,7]])) 
False 
+1

Как насчет ожидаемых выходов? – RafaelC

+0

Являются ли списки всегда вложенными в глубину? –

+0

да это матрица – Sinoda

ответ

1

Если элементы все хешируемые (ints в вашем примере), вы можете добавить их в набор, проверяющий дубликаты.

def check_unique_elem(L): 
    seen = set() 
    for row in L: 
     for i in row: 
      if i in seen: 
       return False 
      seen.add(i) 
    return True 

Это имеет преимущество выхода, как только будет найден первый дубликат (замыкая)

+0

ok я добавил их все в список 1, но как я могу проверить каждый элемент в списке, если он уникален – Sinoda

0

не является оптимальным, но кратким:

def check_unique_elem(mat): 
    flat = [c for row in mat for c in row] 
    return len(flat) == len(set(flat)) 

также менее склонны к синхронизации атак, в очень маловероятно, так, что это вопрос


Или, если вы хотите один вкладыш:

import collections 

has_duplicate = collections.Counter(c for row in mat for c in row).most_common(1)[0][1] > 1 
+0

Эй, мы думаем так! – Brian

+1

Я просто думаю, что на 20 секунд быстрее;) – Eric

1
from itertools import chain 

print(len(set(chain(*l))) == sum(len(s) for s in l)) 

Если ваши списки были очень большими, есть более эффективные способы, если нет, то это краткий способ сделать то, что вы хотите.

Немного как код игры в гольф, но мы могли бы короткое замыкание на Подсписок основе:

l = [[8, 3, 4], [7, 5, 9], [33, 12, 22]] 

st = set() 
print(not any(b == -1 for b in (st.update(s) if st.isdisjoint(s) else -1 
          for s in map(set, l)))) 
+0

Зачем импортировать 'Counter'? – Eric

+0

@ Эрик, он был близок к 'из itertools import chain', когда я скопировал;) –

0

Возможно:

def check_unique_elem(mylist): 
    flattened_list = [i for sublist in mylist for i in sublist] 
    return len(set(flattened_list)) == len(flattened_list) 

print(check_unique_elem([[8, 3, 4], [1, 5, 9], [6, 7, 2]])) 
print(check_unique_elem([[1]])) 
print(check_unique_elem([[2,3],[4,5],[6,7]])) 
0

магазин все в один список, то проверить вхождение каждого элемента с помощью подсчет:

def elements_are_unique(new_list): 
    for element in new_list: 
     icount = new_list.count(element) 
     if icount > 1: 
      return False 
    return True 
Смежные вопросы