Python тіліндегі тізімнен (массивтен) қайталанатын элементтерді жойыңыз және шығарыңыз

Іскерлік

Бұл бөлім тізімнен (массив) қайталанатын элементтерді жою немесе шығарып алу арқылы Python тілінде жаңа тізімді жасау жолын сипаттайды.

Мұнда келесі мәліметтер сипатталған.

  • Қайталанатын элементтерді жойып, жаңа тізімдер жасаңыз
    • Бастапқы тізімнің ретін сақтамаңыз:set()
    • Бастапқы тізімнің ретін сақтайды:dict.fromkeys(),sorted()
    • Екі өлшемді массив (тізімдер тізімі)
  • Қайталанатын элементтерді шығарып, жаңа тізім жасаңыз
    • Бастапқы тізімнің ретін сақтамаңыз
    • Бастапқы тізімнің ретін сақтайды
    • Екі өлшемді массив (тізімдер тізімі)

Сол тұжырымдаманы тізімдердің орнына кортеждерге қолдануға болады.

Келесі мақаланы қараңыз

  • Тізімде немесе кортежде қайталанатын элементтер бар-жоғын анықтағыңыз келсе
  • Бір тізімнің орнына бірнеше тізімдер арасында ортақ немесе ортақ емес элементтерді шығарып алғыңыз келсе

Тізімдер деректердің әртүрлі түрлерін сақтай алатынын және массивтерден қатаң айырмашылығы бар екенін ескеріңіз. Жад өлшемі мен жад мекенжайларын немесе үлкен деректерді сандық өңдеуді қажет ететін процестерде массивтерді өңдеуді қаласаңыз, массив (стандартты кітапхана) немесе NumPy пайдаланыңыз.

Қайталанатын элементтерді жойып, жаңа тізімдер жасаңыз

Бастапқы тізімнің ретін сақтамаңыз:set()

Түпнұсқа тізімнің ретін сақтаудың қажеті болмаса, жиын түрі жиынын жасайтын set() пайдаланыңыз.

Жиын түрі – қайталанатын элементтері жоқ деректер түрі. Тізім немесе басқа деректер түрі set() қызметіне жіберілгенде қайталанатын мәндер еленбейді және тек бірегей мәндер элементтер болып табылатын жиын түрінің нысаны қайтарылады.

Егер сіз оны кортежге айналдырғыңыз келсе, 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() класс әдісін немесе сұрыпталған() кірістірілген функциясын пайдаланыңыз.

dict.fromkeys() кілттері аргументтерде көрсетілген тізімдер, кортеждер және т.б. болатын жаңа сөздік нысанын жасайды. Екінші аргумент алынып тасталса, мән None болады.

Сөздік пернелерінің қайталанатын элементтері болмағандықтан, жиынтықтағыдай қайталанатын мәндер еленбейді. Бұған қоса, элементтері сөздік кілттері болып табылатын тізімді алу үшін сөздік нысанын 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() аргумент тізбегінің ретін сақтайтынына кепілдік берілген. Бұрынғы нұсқалар сұрыпталған() кіріктірілген функциясын төмендегідей пайдаланады.

Элементтердің сұрыпталған тізімін қайтаратын сұрыпталған аргумент кілті үшін тізім кортеж әдісі index() көрсетіңіз.

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'

Себебі тізімдер сияқты хэштелмейтін нысандар жиын түрінің элементтері немесе 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() әдісі Жоқ қайтарады.

Егер бастапқы тізім тізбегінің элементтері көрінгенде жоқ болса, онда және кейін бағаланады.
see.append(x) орындалады және элемент see үшін қосылады.
append() әдісі «Ешбір» мәнін қайтаратындықтан және «Ешбірі» «жалған» мәніне ие болмағандықтан, not seen.append(x) True мәнін бағалайды.
Тізімді түсіну белгісіндегі шартты өрнек True мәніне айналады және соңғы жасалған тізімнің элементі ретінде қосылады.

Егер бастапқы тізім тізбегінің элементтері see ішінде болса, онда x not in seen False, ал тізімді түсіну өрнегі үшін шартты өрнек False болады.
Сондықтан олар соңғы жасалған тізімнің элементтері ретінде қосылмайды.

Басқа әдіс – нәтиже сұрыпталатын болса да, NumPy np.unique() функциясында аргумент осін орнату.

Қайталанатын элементтерді шығарып, жаңа тізім жасаңыз

Бастапқы тізімнің ретін сақтамаңыз

Түпнұсқа тізімнен тек қайталанатын элементтерді шығару үшін collections.Counter() пайдаланыңыз.
Кілттер ретінде элементтері және мәндер ретінде элементтер саны бар коллекцияларды.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() функциясын қайталап орындайтын функция өте тиімсіз екенін ескеріңіз. Ақылды жол болуы мүмкін.

Есептегіш сөздіктің ішкі сыныбы болып табылады, сондықтан тізімді немесе элементтері тізімдер немесе басқа хэштелмейтін нысандар болып табылатын кортежді коллекцияларға өткізсеңіз.Counter(), қате орын алады және оны пайдалана алмайсыз.

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