Ніжэй прыводзіцца апісанне таго, як вызначыць, ці мае спіс (масіў) паўтаральныя элементы (усе элементы унікальныя/ўнікальныя) у 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(). Акрамя таго, пры згладжванні спісу з трох і больш вымярэнняў неабходна вызначыць новую функцыю.