Жагсаалтаас (массив) давхардсан элементүүдийг арилгах эсвэл задлах замаар Python дээр хэрхэн шинэ жагсаалт үүсгэх талаар энэ хэсэгт тайлбарласан болно.
Дараах дэлгэрэнгүй мэдээллийг энд тайлбарласан болно.
- Давхардсан элементүүдийг устгаж, шинэ жагсаалт үүсгэх
- Анхны жагсаалтын дарааллыг бүү хадгал:
set()
- Анхны жагсаалтын дарааллыг хадгална:
dict.fromkeys()
,sorted()
- Хоёр хэмжээст массив (жагсаалтын жагсаалт)
- Анхны жагсаалтын дарааллыг бүү хадгал:
- Давхардсан элементүүдийг задалж, шинэ жагсаалт үүсгэнэ үү
- Анхны жагсаалтын дарааллыг бүү хадгал
- Анхны жагсаалтын дарааллыг хадгална
- Хоёр хэмжээст массив (жагсаалтын жагсаалт)
Жагсаалтын оронд түүвэрт ижил ойлголтыг хэрэглэж болно.
Дараах нийтлэлээс үзнэ үү
- Жагсаалт эсвэл багц нь давхардсан элементүүдтэй эсэхийг тодорхойлохыг хүсвэл
- Хэрэв та нэг жагсаалтын оронд олон жагсаалтын дунд нийтлэг эсвэл нийтлэг биш элементүүдийг задлахыг хүсвэл
Жагсаалт нь өөр өөр төрлийн өгөгдлийг хадгалах боломжтой бөгөөд массиваас эрс ялгаатай гэдгийг анхаарна уу. Хэрэв та санах ойн хэмжээ, санах ойн хаяг эсвэл том өгөгдлийн тоон боловсруулалт шаарддаг процессуудад массивыг зохицуулахыг хүсвэл массив (стандарт номын сан) эсвэл NumPy-г ашиглана уу.
Давхардсан элементүүдийг устгаж, шинэ жагсаалт үүсгэх
Анхны жагсаалтын дарааллыг бүү хадгал:set()
Хэрэв анхны жагсаалтын дарааллыг хадгалах шаардлагагүй бол багц төрлийн багц үүсгэдэг set()-г ашиглана уу.
Багцын төрөл нь давхардсан элементгүй өгөгдлийн төрөл юм. Жагсаалт эсвэл өөр өгөгдлийн төрлийг set() руу шилжүүлэх үед давхардсан утгуудыг үл тоомсорлож, зөвхөн өвөрмөц утгууд нь элемент болох олонлогийн төрлийн объектыг буцаана.
Хэрэв та үүнийг tuple болгохыг хүсвэл tuple() ашиглана уу.
l = [3, 3, 2, 1, 5, 1, 4, 2, 3]
print(set(l))
# {1, 2, 3, 4, 5}
print(list(set(l)))
# [1, 2, 3, 4, 5]
Мэдээжийн хэрэг, үүнийг бас тохируулсан байдлаар үлдээж болно. Багцын төрлийн багцын талаарх дэлгэрэнгүй мэдээллийг дараах нийтлэлээс үзнэ үү.
Анхны жагсаалтын дарааллыг хадгална:dict.fromkeys(),sorted()
Хэрэв та анхны жагсаалтын дарааллыг хадгалахыг хүсвэл толь бичгийн төрлийн fromkeys() ангийн аргыг эсвэл sorted() суулгасан функцийг ашиглана уу.
dict.fromkeys() нь аргументуудад заасан жагсаалт, залгуур гэх мэт түлхүүрүүд болох шинэ толь бичгийн объектыг үүсгэдэг. Хэрэв хоёр дахь аргументыг орхигдуулсан бол утга нь None байна.
Толь бичгийн түлхүүрүүд давхардсан элементгүй тул set() дээрх шиг давхардсан утгыг үл тоомсорлодог. Нэмж дурдахад толь бичгийн объектыг list() руу аргумент болгон дамжуулж, элементүүд нь толь бичгийн түлхүүр болох жагсаалтыг гаргаж болно.
print(dict.fromkeys(l))
# {3: None, 2: None, 1: None, 5: None, 4: None}
print(list(dict.fromkeys(l)))
# [3, 2, 1, 5, 4]
Python 3.7 (CPython нь 3.6) хувилбараас хойш dict.fromkeys() нь аргументуудын дарааллын дарааллыг хадгалдаг нь баталгаатай болсон. Өмнөх хувилбарууд нь sorted()-ыг дараах байдлаар ашигладаг.
Элементүүдийн эрэмбэлэгдсэн жагсаалтыг буцаадаг эрэмбэлэгдсэн аргументын түлхүүрийн жагсаалтын tuple аргын индекс()-ийг зааж өгнө үү.
index() нь жагсаалтын эх жагсаалтын дарааллаар эрэмбэлэхийн тулд эрэмбэлэгдсэн() түлхүүр болгон зааж өгч болох утгын индексийг (жагсаалт дахь элементийн дугаар) буцаадаг арга юм. Аргументын түлхүүрийг дуудах боломжтой (дуудах) объект гэж зааж өгсөн тул () гэж бичиж болохгүй.
print(sorted(set(l), key=l.index))
# [3, 2, 1, 5, 4]
Хоёр хэмжээст массив (жагсаалтын жагсаалт)
Хоёр хэмжээст массивын хувьд (жагсаалтын жагсаалт) set() эсвэл dict.fromkeys()-г ашигласан арга нь TypeError-ийг үүсгэдэг.
l_2d = [[1, 1], [0, 1], [0, 1], [0, 0], [1, 0], [1, 1], [1, 1]]
# l_2d_unique = list(set(l_2d))
# TypeError: unhashable type: 'list'
# l_2d_unique_order = dict.fromkeys(l_2d)
# TypeError: unhashable type: 'list'
Учир нь жагсаалт зэрэг хэш болдоггүй объектууд нь set төрлийн элемент эсвэл dict төрлийн түлхүүр байж болохгүй.
Дараах функцуудыг тодорхойлно уу. Анхны жагсаалтын дараалал нь хадгалагдаж, нэг хэмжээст жагсаалт болон залгуурт ажиллана.
def get_unique_list(seq):
seen = []
return [x for x in seq if x not in seen and not seen.append(x)]
print(get_unique_list(l_2d))
# [[1, 1], [0, 1], [0, 0], [1, 0]]
print(get_unique_list(l))
# [3, 2, 1, 5, 4]
Жагсаалтыг ойлгох тэмдэглэгээг ашигладаг.
Энд бид дараахь зүйлийг ашигладаг
- Хэрэв “X ба Y”-ийн X нь болон операторын богино залгааны үнэлгээнд худал байвал Y-г үнэлээгүй (гүйцээгүй).
- append() арга нь None-г буцаана.
Хэрэв анхны жагсаалтын дарааллын элементүүд харагдах байдалд байхгүй бол дараа нь болон дараа нь үнэлнэ.
see.append(x)-г гүйцэтгэх ба элементийг see-д нэмнэ.
append() арга нь None-г буцаадаг бөгөөд None нь Худал гэсэн утгатай тул not seen.append(x) нь Үнэн гэж үнэлдэг.
Жагсаалтын ойлголтын тэмдэглэгээний нөхцөлт илэрхийлэл нь Үнэн болж, эцсийн үүсгэсэн жагсаалтын элемент болгон нэмнэ.
Хэрэв анхны жагсаалтын дарааллын элементүүд see-д байгаа бол x not in see нь Худал, жагсаалт ойлгох илэрхийллийн нөхцөлт илэрхийлэл нь False байна.
Тиймээс тэдгээрийг эцсийн үүсгэсэн жагсаалтын элемент болгон нэмдэггүй.
Өөр нэг арга бол аргументын тэнхлэгийг NumPy-ийн np.unique() функцэд тохируулах боловч үр дүн нь эрэмбэлэгдэнэ.
Давхардсан элементүүдийг задалж, шинэ жагсаалт үүсгэнэ үү
Анхны жагсаалтын дарааллыг бүү хадгал
Анхны жагсаалтаас зөвхөн давхардсан элементүүдийг задлахын тулд collections.Counter()-г ашиглана уу.
Цуглуулгыг буцаана. Тоолуурыг (толь бичгийн дэд анги) элементүүдийг түлхүүр болгон, элементийн тоог утга болгон өгдөг.
import collections
l = [3, 3, 2, 1, 5, 1, 4, 2, 3]
print(collections.Counter(l))
# Counter({3: 3, 2: 2, 1: 2, 5: 1, 4: 1})
Энэ нь толь бичгийн дэд ангилал учраас items()-г түлхүүр болон утгыг сэргээхэд ашиглаж болно. Хоёр ба түүнээс дээш тооны түлхүүрүүдийг задлахад хангалттай.
print([k for k, v in collections.Counter(l).items() if v > 1])
# [3, 2, 1]
Анхны жагсаалтын дарааллыг хадгална
Дээрх жишээнд үзүүлснээр Python 3.7-с хойш коллекцийн түлхүүрүүд.Counter нь анхны жагсаалтын дарааллыг хадгалдаг гэх мэт.
Өмнөх хувилбаруудад давхардсан элементүүдийг устгахтай адил sorted() ашиглан эрэмбэлэх нь хангалттай.
print(sorted([k for k, v in collections.Counter(l).items() if v > 1], key=l.index))
# [3, 2, 1]
Хэрэв та хуулбарыг байгаагаар нь задлахыг хүсвэл анхны жагсаалтаас хоёр буюу түүнээс дээш тооны элементүүдийг үлдээгээрэй. Захиалга нь мөн хадгалагдаж байна.
cc = collections.Counter(l)
print([x for x in l if cc[x] > 1])
# [3, 3, 2, 1, 1, 2, 3]
Хоёр хэмжээст массив (жагсаалтын жагсаалт)
Хоёр хэмжээст массив (жагсаалтын жагсаалт)-ын хувьд анхны жагсаалтын дараалал хадгалагдаагүй, мөн хадгалагдсан тохиолдолд дараах функцуудыг гүйцэтгэх боломжтой. Энэ нь бас нэг хэмжээст жагсаалт болон залгуурт ажилладаг.
l_2d = [[1, 1], [0, 1], [0, 1], [0, 0], [1, 0], [1, 1], [1, 1]]
def get_duplicate_list(seq):
seen = []
return [x for x in seq if not seen.append(x) and seen.count(x) == 2]
def get_duplicate_list_order(seq):
seen = []
return [x for x in seq if seq.count(x) > 1 and not seen.append(x) and seen.count(x) == 1]
print(get_duplicate_list(l_2d))
# [[0, 1], [1, 1]]
print(get_duplicate_list_order(l_2d))
# [[1, 1], [0, 1]]
print(get_duplicate_list(l))
# [3, 1, 2]
print(get_duplicate_list_order(l))
# [3, 2, 1]
Хэрэв та давхардсан тоогоор задлахыг хүсвэл анхны жагсаалтаас хоёр буюу түүнээс дээш тооны элементүүдийг үлдээнэ үү.
print([x for x in l_2d if l_2d.count(x) > 1])
# [[1, 1], [0, 1], [0, 1], [1, 1], [1, 1]]
count()-ийн тооцооллын нарийн төвөгтэй байдал нь O(n) тул дээр үзүүлсэн count()-г олон дахин гүйцэтгэдэг функц нь маш үр ашиггүй гэдгийг анхаарна уу. Илүү ухаалаг арга байж болох юм.
Тоолуур нь толь бичгийн дэд ангилал тул та жагсаалт эсвэл элементүүд нь жагсаалт эсвэл бусад хэш болдоггүй объектуудыг коллекц руу шилжүүлбэл алдаа гарах бөгөөд та үүнийг ашиглах боломжгүй болно.
# print(collections.Counter(l_2d))
# TypeError: unhashable type: 'list'