Жагсаалт (массив) нь Python хэл дээр давхардсан элементүүдтэй (бүх элементүүд өвөрмөц/өвөрмөц) байгаа эсэхийг дараах тохиолдол бүрийн хувьд хэрхэн тодорхойлох талаар доор тайлбарлав.
- Элемент доторх жагсаалтгүй жагсаалтын хувьд
- Элементүүдийн жагсаалт бүхий жагсаалтын хувьд (хоёр хэмжээст массив, жагсаалтын жагсаалт гэх мэт)
Жагсаалтаас давхардсан элементүүдийг хэрхэн устгах, задлах талаар дараах нийтлэлийг үзнэ үү.
Жагсаалт нь өөр өөр төрлийн өгөгдлийг хадгалах боломжтой бөгөөд массиваас эрс ялгаатай гэдгийг анхаарна уу. Хэрэв та санах ойн хэмжээ, санах ойн хаяг эсвэл том өгөгдлийн тоон боловсруулалт шаарддаг процессуудад массивыг зохицуулахыг хүсвэл массив (стандарт номын сан) эсвэл NumPy-г ашиглана уу.
Жагсаалтад давхардсан элементүүд байгаа эсэхийг тодорхойлох (хэрэв тухайн элемент жагсаалтгүй бол)
Хэрэв элемент жагсаалт гэх мэт шинэчлэгдэх боломжтой объектгүй бол олонлогийн төрлийн үүсгэгч set()-ийг ашиглана уу.
Багцын төрөл нь давхардсан элементгүй өгөгдлийн төрөл юм. Жагсаалтыг үүсгэгч set() руу шилжүүлэх үед давхардсан утгуудыг үл тоомсорлож, зөвхөн элементийн хувьд өвөрмөц утгууд бүхий багц төрлийн объектыг буцаана.
Энэ олонлогийн төрлийн объектын элементүүдийн тоо болон анхны жагсаалтын len() суулгасан функцийг ашиглан олж авч харьцуулна.
- Хэрэв элементүүдийн тоо тэнцүү бол анхны жагсаалтад давхардсан элемент байхгүй болно
- Элементүүдийн тоо өөр байвал давхардсан элементүүдийг анхны жагсаалтад оруулна
Давхардсан элемент байхгүй бол худал, давхардсан элемент байвал үнэн гэж буцаах функцууд дараах байдалтай байна.
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()-г бас ашиглаж болно. Үүнээс гадна, гурав ба түүнээс дээш хэмжээсийн жагсаалтыг тэгшлэхдээ шинэ функцийг тодорхойлох шаардлагатай.