Menentukan sama ada senarai (array) mempunyai elemen pendua dalam Python

Perniagaan

Berikut ialah penerangan tentang cara menentukan sama ada senarai (tatasusunan) mempunyai unsur pendua (semua elemen adalah unik/unik) dalam Python, untuk setiap kes berikut.

  • Untuk senarai tanpa senarai dalam elemen
  • Untuk senarai dengan senarai elemen (tatasusunan dua dimensi, senarai senarai, dsb.)

Lihat artikel berikut tentang cara mengalih keluar atau mengekstrak unsur pendua daripada senarai.

Ambil perhatian bahawa senarai boleh menyimpan jenis data yang berbeza dan berbeza daripada tatasusunan. Jika anda ingin mengendalikan tatasusunan dalam proses yang memerlukan saiz memori dan alamat memori atau pemprosesan berangka data besar, gunakan tatasusunan (pustaka standard) atau NumPy.

Tentukan jika terdapat unsur pendua dalam senarai (jika elemen itu tiada senarai)

Jika elemen tidak mempunyai objek boleh dikemas kini seperti senarai, gunakan set pembina() jenis set set.

Jenis set ialah jenis data yang tidak mempunyai unsur pendua. Apabila senarai dihantar ke set pembina (), nilai pendua diabaikan dan objek jenis ditetapkan dengan hanya nilai unik apabila elemen dikembalikan.

Bilangan elemen dalam objek jenis set ini dan senarai asal diperoleh dan dibandingkan menggunakan fungsi terbina dalam len().

  • Jika bilangan elemen adalah sama, tiada unsur pendua dalam senarai asal
  • Elemen pendua disertakan dalam senarai asal jika bilangan elemen berbeza

Fungsi yang mengembalikan false jika tiada elemen pendua dan benar jika terdapat elemen pendua adalah seperti berikut

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

Contohnya ialah senarai, tetapi fungsi yang sama boleh digunakan dengan tupel.

Objek boleh ubah (boleh dikemas kini) seperti senarai tidak boleh menjadi elemen set jenis. Oleh itu, senarai dengan senarai sebagai elemen (tatasusunan dua dimensi, senarai senarai, dll.) akan menghasilkan TypeError. Tindakan balas ditunjukkan di bawah.

l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'

Tentukan jika terdapat unsur pendua dalam senarai (jika elemen itu mempunyai senarai)

Dalam kes senarai dengan senarai elemen (seperti senarai senarai), fungsi berikut boleh digunakan untuk menentukan sama ada terdapat unsur pendua.

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

Daripada set(), notasi pemahaman senarai menjana senarai yang elemennya hanya nilai unik dan bilangan elemen dibandingkan. Lihat artikel berikut untuk butirannya.

Fungsi ini juga sah untuk senarai yang tidak mempunyai senarai elemen.

l = [0, 1, 2]
print(has_duplicates2(l))
# False

l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True

Contoh setakat ini ialah penentuan sama ada senarai elemen diduakan (mengandungi senarai yang sama).

Sama ada elemen setiap senarai bertindih boleh ditentukan selepas meratakan senarai asal kepada satu dimensi.

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

Di sini, sum() digunakan untuk meratakan senarai, tetapi itertools.chain.from_iterable() juga boleh digunakan. Di samping itu, apabila meratakan senarai tiga atau lebih dimensi, adalah perlu untuk menentukan fungsi baharu.