ต่อไปนี้เป็นคำอธิบายเกี่ยวกับวิธีการตรวจสอบว่ารายการ (อาร์เรย์) มีองค์ประกอบที่ซ้ำกัน (องค์ประกอบทั้งหมดไม่ซ้ำกัน/ไม่ซ้ำกัน) ใน Python สำหรับแต่ละกรณีต่อไปนี้
- สำหรับรายการที่ไม่มีรายการในองค์ประกอบ
- สำหรับรายการที่มีรายการองค์ประกอบ (อาร์เรย์สองมิติ รายการรายการ ฯลฯ)
ดูบทความต่อไปนี้เกี่ยวกับวิธีลบหรือแยกองค์ประกอบที่ซ้ำกันออกจากรายการ
โปรดทราบว่ารายการสามารถจัดเก็บข้อมูลประเภทต่างๆ และแตกต่างจากอาร์เรย์โดยสิ้นเชิง หากคุณต้องการจัดการอาร์เรย์ในกระบวนการที่ต้องการขนาดหน่วยความจำและที่อยู่หน่วยความจำ หรือการประมวลผลตัวเลขของข้อมูลขนาดใหญ่ ให้ใช้อาร์เรย์ (ไลบรารีมาตรฐาน) หรือ NumPy
ตรวจสอบว่ามีองค์ประกอบที่ซ้ำกันในรายการหรือไม่ (หากองค์ประกอบนั้นไม่มีรายการ)
หากองค์ประกอบไม่มีวัตถุที่สามารถอัปเดตได้ เช่น รายการ ให้ใช้ชุดตัวสร้าง () ของประเภทชุดชุด
- ที่เกี่ยวข้อง:ตั้งค่าการดำเนินการ (เช่น การกำหนดชุดยูเนียน ชุดผลิตภัณฑ์ และชุดย่อย) ด้วยประเภทชุดของ Python
ประเภทชุดเป็นประเภทข้อมูลที่ไม่มีองค์ประกอบที่ซ้ำกัน เมื่อรายการถูกส่งไปยังชุดตัวสร้าง () ค่าที่ซ้ำกันจะถูกละเว้นและวัตถุประเภทชุดที่มีค่าเฉพาะเฉพาะเมื่อองค์ประกอบถูกส่งกลับ
จำนวนองค์ประกอบในวัตถุประเภทเซ็ตนี้และรายการดั้งเดิมจะได้รับและเปรียบเทียบโดยใช้ฟังก์ชัน 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() ได้ นอกจากนี้ เมื่อทำการแบนรายการที่มีสามมิติขึ้นไป จำเป็นต้องกำหนดฟังก์ชันใหม่