Python-da siyahıdan (massivdən) dublikat elementləri çıxarın və çıxarın

Biznes

Bu bölmə siyahıdan (massivdən) dublikat elementləri silməklə və ya çıxarmaqla Python-da yeni siyahının necə yaradılacağını təsvir edir.

Aşağıdakı təfərrüatlar burada təsvir edilmişdir.

  • Dublikat elementləri silin və yeni siyahılar yaradın
    • Orijinal siyahının sırasını saxlamayın:set()
    • Orijinal siyahının sırasını qoruyur:dict.fromkeys(),sorted()
    • İki ölçülü massiv (siyahıların siyahısı)
  • Dublikat elementləri çıxarın və yeni siyahı yaradın
    • Orijinal siyahının sırasını saxlamayın
    • Orijinal siyahının sırasını qoruyur
    • İki ölçülü massiv (siyahıların siyahısı)

Eyni anlayışı siyahılar yerinə tuplelərə də tətbiq etmək olar.

üçün aşağıdakı məqaləyə baxın

  • Siyahı və ya dəftərdə dublikat elementlərin olub-olmadığını müəyyən etmək istəyirsinizsə
  • Bir siyahı əvəzinə bir neçə siyahı arasında ümumi və ya ümumi olmayan elementləri çıxarmaq istəyirsinizsə

Qeyd edək ki, siyahılar müxtəlif növ verilənləri saxlaya bilər və massivlərdən ciddi şəkildə fərqlənir. Yaddaş ölçüsü və yaddaş ünvanları və ya böyük verilənlərin ədədi emalı tələb olunan proseslərdə massivləri idarə etmək istəyirsinizsə, massivdən (standart kitabxana) və ya NumPy istifadə edin.

Dublikat elementləri silin və yeni siyahılar yaradın

Orijinal siyahının sırasını saxlamayın:set()

Orijinal siyahının sırasını qorumağa ehtiyac yoxdursa, set tip dəsti yaradan set() funksiyasından istifadə edin.

Dəst növü dublikat elementləri olmayan məlumat növüdür. Siyahı və ya digər məlumat növü set()-ə ötürüldükdə, dublikat dəyərlər nəzərə alınmır və yalnız unikal dəyərlərin elementlər olduğu dəst tipli obyekt qaytarılır.

Əgər onu tuple etmək istəyirsinizsə, tuple() istifadə edin.

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]

Təbii ki, onu da təyin olunmuş kimi buraxmaq olar. Dəst növü dəsti haqqında ətraflı məlumat üçün aşağıdakı məqaləyə baxın.

Orijinal siyahının sırasını qoruyur:dict.fromkeys(),sorted()

Əgər siz orijinal siyahının sırasını qorumaq istəyirsinizsə, lüğət növünün fromkeys() sinif metodundan və ya sorted() daxili funksiyasından istifadə edin.

dict.fromkeys() açarları arqumentlərdə göstərilən siyahılar, dəstlər və s. olan yeni lüğət obyekti yaradır. İkinci arqument buraxılıbsa, dəyər Yoxdur.

Lüğət açarlarında dublikat elementlər olmadığı üçün set()-də olduğu kimi dublikat dəyərlər nəzərə alınmır. Bundan əlavə, elementləri lüğət açarları olan siyahı əldə etmək üçün lüğət obyekti list()-ə arqument kimi ötürülə bilər.

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-dən (CPython 3.6-dır) zəmanət verilir ki, dict.fromkeys() arqument ardıcıllığının sırasını qoruyur. Əvvəlki versiyalar sorted() daxili funksiyasından aşağıdakı kimi istifadə edir.

Elementlərin çeşidlənmiş siyahısını qaytaran sıralanmış arqument açarı üçün siyahı tuple metodu index() təyin edin.

index() dəyərin indeksini (siyahıdakı elementin nömrəsini) qaytaran bir üsuldur və bu, siyahının orijinal siyahının sırasına əsasən çeşidlənməsi üçün sorted() açarı kimi təyin edilə bilər. Arqument açarı çağırıla bilən (çağırılan) obyekt kimi göstərilmişdir, ona görə də () yazmayın.

print(sorted(set(l), key=l.index))
# [3, 2, 1, 5, 4]

İki ölçülü massiv (siyahıların siyahısı)

İki ölçülü massivlər (siyahıların siyahıları) üçün set() və ya dict.fromkeys() funksiyalarından istifadə edilən metod TypeError ilə nəticələnir.

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'

Bunun səbəbi, siyahılar kimi qeyri-hashable obyektlərin dəst tipli elementlər və ya dict tipli düymələr ola bilməz.

Aşağıdakı funksiyaları təyin edin Orijinal siyahının sırası qorunub saxlanılır və birölçülü siyahılar və tuplelər üçün işləyir.

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]

Siyahının başa düşülməsi qeydindən istifadə olunur.

Burada aşağıdakılardan istifadə edirik

  • Əgər və operatorunun qısaqapanma qiymətləndirməsində “X və Y”-də X yanlışdırsa, Y qiymətləndirilmir (icra edilmir).
  • append() metodu Yox qaytarır.

Orijinal siyahı seq elementləri görünəndə mövcud deyilsə, onda və sonra qiymətləndirilir.
see.append(x) yerinə yetirilir və element görülməyə əlavə olunur.
append() metodu Heç biri qaytardığına və Heç biri Yanlış olduğuna görə not görüldü.append(x) Doğru olaraq qiymətləndirir.
Siyahının başa düşülməsi qeydindəki şərt ifadəsi True olur və son yaradılan siyahının elementi kimi əlavə edilir.

Əgər ilkin siyahı seq elementləri see-də mövcuddursa, o zaman x not in seen False, siyahının başa düşülməsi ifadəsi üçün şərti ifadə isə False-dir.
Buna görə də, onlar son yaradılan siyahının elementləri kimi əlavə edilmir.

Digər üsul NumPy-nin np.unique() funksiyasında arqument oxunu təyin etməkdir, baxmayaraq ki, nəticə çeşidlənəcək.

Dublikat elementləri çıxarın və yeni siyahı yaradın

Orijinal siyahının sırasını saxlamayın

Orijinal siyahıdan yalnız dublikat elementləri çıxarmaq üçün collections.Counter() istifadə edin.
Collections.Counter (lüğətin alt sinfi) elementləri açar kimi, elementlərin sayı isə dəyər kimi qaytarır.

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})

Lüğətin alt sinfi olduğundan, items() açarları və dəyərləri əldə etmək üçün istifadə edilə bilər. Sayı iki və ya daha çox olan açarları çıxarmaq kifayətdir.

print([k for k, v in collections.Counter(l).items() if v > 1])
# [3, 2, 1]

Orijinal siyahının sırasını qoruyur

Yuxarıdakı nümunədə göstərildiyi kimi, Python 3.7-dən bəri kolleksiyaların açarları.Counter orijinal siyahının sırasını saxlayır və s.

Əvvəlki versiyalarda dublikat elementləri silmək kimi sorted() ilə çeşidləmək kifayətdir.

print(sorted([k for k, v in collections.Counter(l).items() if v > 1], key=l.index))
# [3, 2, 1]

Əgər dublikatları olduğu kimi çıxarmaq istəyirsinizsə, sadəcə olaraq iki və ya daha çox sayda elementləri orijinal siyahıdan buraxın. Sifariş də qorunub saxlanılır.

cc = collections.Counter(l)
print([x for x in l if cc[x] > 1])
# [3, 3, 2, 1, 1, 2, 3]

İki ölçülü massiv (siyahıların siyahısı)

İki ölçülü massivlər (siyahıların siyahıları) üçün ilkin siyahının sırası saxlanmadıqda və müvafiq olaraq saxlanıldıqda aşağıdakı funksiyalar mümkündür. O, həmçinin birölçülü siyahılar və tuplelər üçün işləyir.

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]

Əgər dublikatlarla çıxarmaq istəyirsinizsə, iki və ya daha çox sayı olan elementləri orijinal siyahıdan buraxın.

print([x for x in l_2d if l_2d.count(x) > 1])
# [[1, 1], [0, 1], [0, 1], [1, 1], [1, 1]]

Qeyd edək ki, count()-un hesablama mürəkkəbliyi O(n) olduğundan, yuxarıda göstərilən count()-u təkrar-təkrar icra edən funksiya çox səmərəsizdir. Daha ağıllı bir yol ola bilər.

Sayğac lüğətin alt sinfidir, ona görə də siz elementləri siyahılar və ya digər qeyri-hashable obyektlər olan siyahı və ya tupleni kolleksiyalara keçirsəniz.Counter(), xəta baş verəcək və siz ondan istifadə edə bilməyəcəksiniz.

# print(collections.Counter(l_2d))
# TypeError: unhashable type: 'list'
Copied title and URL