Вызначэнне таго, ці мае спіс (масіў) паўтаральныя элементы ў Python

Бізнэс

Ніжэй прыводзіцца апісанне таго, як вызначыць, ці мае спіс (масіў) паўтаральныя элементы (усе элементы унікальныя/ўнікальныя) у Python для кожнага з наступных выпадкаў.

  • Для спісу без спісу ў элеменце
  • Для спісаў са спісамі элементаў (двухмерныя масівы, спісы спісаў і г.д.)

Глядзіце наступны артыкул аб тым, як выдаліць або выняць дублікаты элементаў са спісу.

Звярніце ўвагу, што спісы могуць захоўваць розныя тыпы даных і строга адрозніваюцца ад масіваў. Калі вы хочаце апрацоўваць масівы ў працэсах, якія патрабуюць памеру памяці і адрасоў памяці або лікавай апрацоўкі вялікіх даных, выкарыстоўвайце масіў (стандартная бібліятэка) або NumPy.

Вызначыць, ці ёсць у спісе паўтаральныя элементы (калі элемент не мае спісу)

Калі элемент не мае аб’екта, які можна абнаўляць, напрыклад спісу, выкарыстоўвайце канструктар set() тыпу набора.

Тып набору – гэта тып даных, які не мае паўтаральных элементаў. Калі спіс перадаецца канструктару set(), паўтараюцца значэнні ігнаруюцца, і вяртаецца аб’ект тыпу набора з унікальнымі значэннямі ў якасці элементаў.

Колькасць элементаў у гэтым аб’екце тыпу набора і зыходны спіс атрымліваюцца і параўноўваюцца з дапамогай убудаванай функцыі len().

  • Калі колькасць элементаў роўнае, у зыходным спісе няма паўтаральных элементаў
  • Паўторныя элементы ўключаюцца ў зыходны спіс, калі колькасць элементаў адрозніваецца

Функцыі, якія вяртаюць false, калі няма паўтаральных элементаў, і true, калі ёсць паўтаральныя элементы

def has_duplicates(seq):
    return len(seq) != len(set(seq))

l = [0, 1, 2]
print(has_duplicates(l))
# False

l = [0, 1, 1, 2]
print(has_duplicates(l))
# True

Прыкладам з’яўляецца спіс, але тую ж функцыю можна выкарыстоўваць з картэжамі.

Зменлівыя (абнаўляльныя) аб’екты, такія як спісы, не могуць быць элементамі набору тыпаў. Такім чынам, спісы са спісамі ў якасці элементаў (двухмерныя масівы, спісы спісаў і г.д.) прывядуць да TypeError. Контрмера паказана ніжэй.

l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'

Вызначыць, ці ёсць у спісе элементы, якія паўтараюцца (калі элемент мае спіс)

У выпадку спісу са спісам элементаў (напрыклад, спіс спісаў), наступныя функцыі могуць быць выкарыстаны, каб вызначыць, ці ёсць паўтаральныя элементы.

def has_duplicates2(seq):
    seen = []
    unique_list = [x for x in seq if x not in seen and not seen.append(x)]
    return len(seq) != len(unique_list)

l_2d = [[0, 0], [0, 1], [1, 1], [1, 0]]
print(has_duplicates2(l_2d))
# False

l_2d = [[0, 0], [0, 1], [1, 1], [1, 1]]
print(has_duplicates2(l_2d))
# True

Замест set() натацыя разумення спісу генеруе спіс, элементы якога з’яўляюцца толькі унікальнымі значэннямі, і колькасць элементаў параўноўваецца. Больш падрабязную інфармацыю глядзіце ў наступным артыкуле.

Гэтая функцыя таксама дзейнічае для спісаў, якія не маюць спісу элементаў.

l = [0, 1, 2]
print(has_duplicates2(l))
# False

l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True

Прыкладам да гэтага часу з’яўляецца вызначэнне таго, ці дублюецца спіс элементаў (утрымлівае той жа спіс).

Ці можна вызначыць, ці перакрываюцца элементы кожнага спісу пасля звядзення зыходнага спісу ў адно вымярэнне.

l_2d = [[0, 1], [2, 3]]
print(sum(l_2d, []))
# [0, 1, 2, 3]

print(has_duplicates(sum(l_2d, [])))
# False

l_2d = [[0, 1], [2, 0]]
print(has_duplicates(sum(l_2d, [])))
# True

Тут для выраўноўвання спісу выкарыстоўваецца sum(), але можна таксама выкарыстоўваць itertools.chain.from_iterable(). Акрамя таго, пры згладжванні спісу з трох і больш вымярэнняў неабходна вызначыць новую функцыю.