การพิจารณาว่ารายการ (อาร์เรย์) มีองค์ประกอบที่ซ้ำกันใน Python . หรือไม่

ธุรกิจ

ต่อไปนี้เป็นคำอธิบายเกี่ยวกับวิธีการตรวจสอบว่ารายการ (อาร์เรย์) มีองค์ประกอบที่ซ้ำกัน (องค์ประกอบทั้งหมดไม่ซ้ำกัน/ไม่ซ้ำกัน) ใน Python สำหรับแต่ละกรณีต่อไปนี้

  • สำหรับรายการที่ไม่มีรายการในองค์ประกอบ
  • สำหรับรายการที่มีรายการองค์ประกอบ (อาร์เรย์สองมิติ รายการรายการ ฯลฯ)

ดูบทความต่อไปนี้เกี่ยวกับวิธีลบหรือแยกองค์ประกอบที่ซ้ำกันออกจากรายการ

โปรดทราบว่ารายการสามารถจัดเก็บข้อมูลประเภทต่างๆ และแตกต่างจากอาร์เรย์โดยสิ้นเชิง หากคุณต้องการจัดการอาร์เรย์ในกระบวนการที่ต้องการขนาดหน่วยความจำและที่อยู่หน่วยความจำ หรือการประมวลผลตัวเลขของข้อมูลขนาดใหญ่ ให้ใช้อาร์เรย์ (ไลบรารีมาตรฐาน) หรือ NumPy

ตรวจสอบว่ามีองค์ประกอบที่ซ้ำกันในรายการหรือไม่ (หากองค์ประกอบนั้นไม่มีรายการ)

หากองค์ประกอบไม่มีวัตถุที่สามารถอัปเดตได้ เช่น รายการ ให้ใช้ชุดตัวสร้าง () ของประเภทชุดชุด

ประเภทชุดเป็นประเภทข้อมูลที่ไม่มีองค์ประกอบที่ซ้ำกัน เมื่อรายการถูกส่งไปยังชุดตัวสร้าง () ค่าที่ซ้ำกันจะถูกละเว้นและวัตถุประเภทชุดที่มีค่าเฉพาะเฉพาะเมื่อองค์ประกอบถูกส่งกลับ

จำนวนองค์ประกอบในวัตถุประเภทเซ็ตนี้และรายการดั้งเดิมจะได้รับและเปรียบเทียบโดยใช้ฟังก์ชัน 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() ได้ นอกจากนี้ เมื่อทำการแบนรายการที่มีสามมิติขึ้นไป จำเป็นต้องกำหนดฟังก์ชันใหม่