Төменде тізімде (массивте) келесі жағдайлардың әрқайсысы үшін Python тілінде қайталанатын элементтердің (барлық элементтер бірегей/бірегей) бар-жоғын анықтау жолы сипатталған.
- Элементте тізімі жоқ тізім үшін
- Элементтер тізімі бар тізімдер үшін (екі өлшемді массивтер, тізімдер тізімдері және т.б.)
Тізімнен қайталанатын элементтерді жою немесе шығару жолы туралы келесі мақаланы қараңыз.
Тізімдер деректердің әртүрлі түрлерін сақтай алатынын және массивтерден қатаң айырмашылығы бар екенін ескеріңіз. Жад өлшемі мен жад мекенжайларын немесе үлкен деректерді сандық өңдеуді қажет ететін процестерде массивтерді өңдеуді қаласаңыз, массив (стандартты кітапхана) немесе NumPy пайдаланыңыз.
Тізімде қайталанатын элементтердің бар-жоғын анықтаңыз (егер элементте тізім болмаса)
Элементте тізім сияқты жаңартылатын нысан болмаса, жиын жиыны түрінің конструктор жиынтығын() пайдаланыңыз.
Жиын түрі – қайталанатын элементтері жоқ деректер түрі. Тізім set() конструкторына берілгенде қайталанатын мәндер еленбейді және элементтер ретінде тек бірегей мәндері бар жиын типті нысан қайтарылады.
Осы жиын түріндегі нысандағы элементтер саны және бастапқы тізім кірістірілген len() функциясы арқылы алынады және салыстырылады.
- Элементтердің саны тең болса, бастапқы тізімде қайталанатын элементтер жоқ
- Элементтердің саны әртүрлі болса, қайталанатын элементтер бастапқы тізімге енгізіледі
Қайталанатын элементтер жоқ болса false және қайталанатын элементтер болса true мәнін қайтаратын функциялар келесідей
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() функциясын да пайдалануға болады. Сонымен қатар, үш немесе одан да көп өлшемдердің тізімін тегістеу кезінде жаңа функцияны анықтау қажет.