Как посчитать количество уникальных элементов в списке python
Перейти к содержимому

Как посчитать количество уникальных элементов в списке python

  • автор:

Как подсчитать уникальные значения в Pandas (с примерами)

Вы можете использовать функцию nunique() для подсчета количества уникальных значений в кадре данных pandas.

Эта функция использует следующий базовый синтаксис:

#count unique values in each column df.nunique () #count unique values in each row df.nunique (axis= 1 ) 

В следующих примерах показано, как использовать эту функцию на практике со следующими пандами DataFrame:

import pandas as pd #create DataFrame df = pd.DataFrame() #view DataFrame df team points assists rebounds 0 A 8 5 11 1 A 8 8 8 2 A 13 7 11 3 A 13 9 6 4 B 22 12 6 5 B 22 9 5 6 B 25 9 9 7 B 29 4 12 

Пример 1. Подсчет уникальных значений в каждом столбце

Следующий код показывает, как подсчитать количество уникальных значений в каждом столбце DataFrame:

#count unique values in each column df.nunique () team 2 points 5 assists 5 rebounds 6 dtype: int64 

Из вывода мы видим:

  • Столбец «команда» имеет 2 уникальных значения.
  • Столбец «баллы» имеет 5 уникальных значений.
  • Столбец «Помощь» имеет 5 уникальных значений.
  • Столбец «Подборы» имеет 6 уникальных значений.

Пример 2. Подсчет уникальных значений в каждой строке

В следующем коде показано, как подсчитать количество уникальных значений в каждой строке DataFrame:

#count unique values in each row df.nunique (axis= 1 ) 0 4 1 2 2 4 3 4 4 4 5 4 6 3 7 4 dtype: int64 

Из вывода мы видим:

  • Первая строка имеет 4 уникальных значения
  • Вторая строка имеет 2 уникальных значения
  • Третья строка имеет 4 уникальных значения

Пример 3. Подсчет уникальных значений по группам

В следующем коде показано, как подсчитать количество уникальных значений по группам в DataFrame:

#count unique 'points' values, grouped by team df.groupby('team')['points']. nunique () team A 2 B 3 Name: points, dtype: int64 

Из вывода мы видим:

  • Команда «А» имеет 2 уникальных значения «очков».
  • Команда «Б» имеет 3 уникальных значения «очков».

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные операции в pandas:

Как подсчитать уникальные значения в массиве NumPy (3 примера)

Вы можете использовать следующие методы для подсчета уникальных значений в массиве NumPy:

Способ 1: отображение уникальных значений

np.unique (my_array) 

Метод 2: подсчет количества уникальных значений

len (np.unique (my_array)) 

Способ 3: подсчет вхождений каждого уникального значения

np.unique (my_array, return_counts= True ) 

В следующих примерах показано, как использовать каждый метод на практике со следующим массивом NumPy:

import numpy as np #create NumPy array my_array = np.array([1, 3, 3, 4, 4, 7, 8, 8]) 

Пример 1: отображение уникальных значений

Следующий код показывает, как отобразить уникальные значения в массиве NumPy:

#display unique values np.unique (my_array) array([1, 3, 4, 7, 8]) 

На выходе мы видим каждое из уникальных значений в массиве NumPy: 1, 3, 4, 7, 8.

Пример 2. Подсчет количества уникальных значений

В следующем коде показано, как подсчитать общее количество уникальных значений в массиве NumPy:

#display total number of unique values len (np.unique (my_array)) 5 

Из вывода мы видим, что в массиве NumPy есть 5 уникальных значений.

Пример 3. Подсчет вхождений каждого уникального значения

В следующем коде показано, как подсчитать количество вхождений каждого уникального значения в массиве NumPy:

#count occurrences of each unique value np.unique (my_array, return_counts= True ) (array([1, 3, 4, 7, 8]), array([1, 2, 2, 1, 2])) 

Первый массив в выходных данных показывает уникальные значения, а второй массив показывает количество каждого уникального значения.

Мы можем использовать следующий код для вывода этого вывода в более удобном для чтения формате:

#get unique values and counts of each value unique, counts = np.unique (my_array, return_counts= True ) #display unique values and counts side by side print(np.asarray ((unique, counts)). T ) [[1 1] [3 2] [4 2] [7 1] [8 2]] 

Из вывода мы видим:

  • Значение 1 встречается 1 раз.
  • Значение 3 встречается 2 раза.
  • Значение 4 встречается 2 раза.
  • Значение 7 встречается 1 раз.
  • Значение 8 встречается 2 раза.

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные операции в Python:

Как получить уникальные элементы списка python

Предположим, есть список, который содержит повторяющиеся числа:

numbers = [1, 1, 2, 3, 3, 4]

Но нужен список с уникальными числами:

numbers = [1, 2, 3, 4]

Есть несколько вариантов, как можно получить уникальные значения. Разберем их.

Вариант №1. Использование множества (set) для получения элементов

Использование множества ( set ) — один из вариантов. Он удобен тем, что включает только уникальные элементы. После этого множество можно обратно превратить в список.

Посмотрим на два способа использования множества и списка. Первый — достаточно подробный, но он позволяет увидеть происходящее на каждом этапе.

 
numbers = [1, 2, 2, 3, 3, 4, 5]

def get_unique_numbers(numbers):
list_of_unique_numbers = []
unique_numbers = set(numbers)

for number in unique_numbers:
list_of_unique_numbers.append(number)

return list_of_unique_numbers

print(get_unique_numbers(numbers))

Разберем, что происходит на каждом этапе. Есть список чисел numbers . Передаем его в функцию get_unique_numbers .

Внутри этой функции создается пустой список, который в итоге будет включать все уникальные числа. После этого используется set для получения уникальных чисел из списка numbers .

 
unique_numbers = set(numbers)

В итоге имеется перечень из уникальных чисел. Осталось сделать из него список. Для этого можно использовать цикл, перебирая каждый из элементов.

 
for number in unique_numbers:
list_of_unique_numbers.append(number)

На каждой итерации текущее число добавляется в список list_of_unique_numbers . Наконец, именно этот список возвращается в конце программы.

Есть и более короткий способ использования множества для получения уникальных значений в Python. О нем и пойдет речь дальше.

Короткий вариант с set

Весь код выше можно сжать в одну строку с помощью встроенных в Python функций.

 
numbers = [1, 2, 2, 3, 3, 4, 5]
unique_numbers = list(set(numbers))
print(unique_numbers)

Хотя этот код сильно отличается от первого примера, идея та же. Сперва множество используется для получения уникальных значений. После этого множество превращается в список.

 
unique_numbers = list(set(numbers))

Проще всего думать «изнутри наружу» при чтении этого кода. Самый вложенный код выполняется первым: set(numbers) . Затем — внешний блок: list(set(numbers)) .

Вариант №2. Использование цикла for

Также стоит рассмотреть подход с использованием цикла.

Для начала нужно создать пустой список, который будет включать уникальные числа. После этого можно задействовать цикл для итерации по каждому числу в переданном списке. Если число из него есть в уникальном, то можно переходить к следующему элементу. В противном случае — добавить это число.

Рассмотрим два способа использования цикла. Начнем с более подробного.

 
numbers = [20, 20, 30, 30, 40]

def get_unique_numbers(numbers):
unique = []

for number in numbers:
if number in unique:
continue
else:
unique.append(number)
return unique

print(get_unique_numbers(numbers))

Вот что происходит на каждом этапе. Сначала есть список чисел numbers . Он передается в функцию get_unique_numbers .

Внутри этой функции создается пустой список unique . В итоге он будет включать все уникальные значения.

Цикл будет использоваться для перебора по числам в списке numbers .

 
for number in numbers:
if number in unique:
continue
else:
unique.append(number)

Условные конструкции в цикле проверяют, есть ли число текущей итерации в списке unique . Если да, то цикл переходит на следующую итерации. Если нет — число добавляется в список.

Важно отметить, что добавляются только уникальные числа. Когда цикл завершен, список unique с уникальными числами возвращается.

Короткий способ с циклом

Есть и другой способ использования варианта с циклом, который короче на несколько строк.

 
numbers = [20, 20, 30, 30, 40]

def get_unique_numbers(numbers):
unique = []
for number in numbers:
if number not in unique:
unique.append(number)
return unique

Разница в условной конструкции. В этот раз она следующая — если числа нет в unique , то его нужно добавить.

 
if number not in unique:
unique.append(number)

В противном случае цикл перейдет к следующему числу в списке numbers .

Результат будет тот же. Но иногда подобное читать сложнее, когда булево значение опускается.

Есть еще несколько способов поиска уникальных значений в списке Python. Но достаточно будет тех, которые описаны в этой статье.

Я создал этот блог в 2018 году, чтобы распространять полезные учебные материалы, документации и уроки на русском. На сайте опубликовано множество статей по основам python и библиотекам, уроков для начинающих и примеров написания программ.

Мои контакты: Почта
Python Q https://yandex.ru/q/loves/python Online

Python Q CEO Pythonru admin@pythonru.com https://secure.gravatar.com/avatar/b16f253879f7349f64830c64d1da4415?s=96&d=mm&r=g CEO Pythonru Python Александр Редактор https://t.me/cashncarryhttps://pythonru.com/https://yandex.ru/q/profile/cashnc/ PythonRu.com admin@pythonru.com Alex Zabrodin 2018-10-26 Online Python, Programming, HTML, CSS, JavaScript

Посчитать количество уникальных элементов в списке?

У меня есть список, к примеру [0, 1, 1, 3, -1, 3] . Результат должен быть "4". Не понимаю, как это реализовать, возможно есть какая-то функция?

Отслеживать
25.7k 4 4 золотых знака 21 21 серебряный знак 36 36 бронзовых знаков
задан 20 дек 2020 в 18:27
33 1 1 золотой знак 1 1 серебряный знак 6 6 бронзовых знаков
Возможно, стоит уже учить язык и начать читать про базовые типы данных?
20 дек 2020 в 18:33

4 ответа 4

Сортировка: Сброс на вариант по умолчанию

lst = [0, 1, 1, 3, -1, 3] print(len(set(lst)) 

В принципе, это можно и вручную сделать через словарь, но есть готовый тип данных для хранения уникальных элементов set (множество).

Отслеживать
ответ дан 20 дек 2020 в 18:31
69.9k 5 5 золотых знаков 20 20 серебряных знаков 51 51 бронзовый знак

arr = [0, 1, 1, 3, -1, 3] 
print(len(set(arr))) 
arr2 = [] for i in arr: if i not in arr2: arr2.append(i) print(len(arr2)) 
print(len([i for i in enumerate(sorted(arr)) if i[0] == 0 or i[1] != sorted(arr)[i[0] - 1]])) 
print(len([i for i in zip(sorted(arr), sorted(arr)[1:] + [sorted(arr)[0]]) if i[0] != i[1]])) 
print(len([i for i in range(len(arr)) if min(sorted(arr)[i:]) != min(sorted(arr)[i - 1:])])) 
print(len([i for i in range(len(arr)) if arr[i] not in arr[i + 1:]])) 
print(len([i for i in range(len(arr)) if arr[i:].count(arr[i]) == 1])) 
  • хватит разврата. и откопал стюардессу

Отслеживать
ответ дан 20 дек 2020 в 18:43
37.4k 4 4 золотых знака 28 28 серебряных знаков 76 76 бронзовых знаков
Только надо всё же упомянуть, что для больших списков всё кроме множества будет работать медленно )
21 дек 2020 в 8:40

это да, но вот интересный вопрос - если диапазон значений огромный в списке, чтоб нельзя было O(1) устроить, то есть ли способ подсчитать кол-во уникальных значений быстрее, чем чем через set

21 дек 2020 в 8:45

print(sum(arr[i] not in arr[:i]for i in range(len(arr)))) print(len()) print(len()) print(len()) 

Отслеживать
ответ дан 20 дек 2020 в 18:59
19.7k 6 6 золотых знаков 22 22 серебряных знака 56 56 бронзовых знаков

Корректное решение требует определённых усилий. Первое что нужно - функция которая умеет считать длину генератора. Так как мы оптимизируем решение по памяти, то len(list(. )) не подходит. Вот одно из из самых простых и ясных решений:

def count(a): return max(enumerate(a, 1), default=(0, None))[0] 

Сосчитаем одинаковые соседние элементы в списке. На этот раз нам не нужно экономить память так как на входе у нас список (или кортеж, или строка - решение достаточно универсальное):

def n_duplicates(a): return count(None for a, b in zip(a[:-1], a[1:]) if a == b) 

К сожалению, исходный список может иметь несоседние одинаковые элементы. Очевидно, их можно сделать соседними с помощью перестановки. Хотя мы не знаем какая именно перестановка нам нужна, мы точно знаем что это перестановка. Переберём перестановки, нам нужна та где количество дубликатов самое большое. Этот максимум вычтем из длины исходного массива:

def n_uniques(a): return len(a) - max(n_duplicates(b) for b in itertools.permutations(a)) 

Решение достаточно изящно и отлично работает:

@>>> print(n_uniques([0, 1, 1, 3, -1, 3])) 4 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *