Как получить количество различных значений в словаре python

#python #dictionary

#python #словарь

Вопрос:

Словарь ниже

 todos = [{'userId': 1, 'id': 1, 'title': 'A', 'completed': False},
     {'userId': 1, 'id': 2, 'title': 'B ', 'completed': False},
     {'userId': 1, 'id': 1, 'title': 'C', 'completed': False},
     {'userId': 1, 'id': 2, 'title': 'A', 'completed': True},
     {'userId': 2, 'id': 1,'title': 'B', 'completed': False}]
 

Ниже приведен код для печати значений

 for i in todos:
    print((i['userId']))
for i in todos:
    print((i['title']))
for i in todos:
    print((i['completed']))
 

Ожидаемый результат

 {"userid" : 2, "title":3, "completed" : 2}
 

Мне просто нужно различное количество значений

  • userid их всего 2, потому 1 2 что присутствуют значения и
  • title равно 3, поскольку значения A , B , C
  • completed равно 2, поскольку значения True и False

Комментарии:

1. Должно ли ‘B’ быть ‘B’ — удалить лишний пробел?

Ответ №1:

Используйте понимание списка и длину набора следующим образом:

 cnt = {}
for todos_key in todos[0].keys():
    cnt[todos_key] = len(set([item[todos_key] for item in todos]))
print(cnt)
# {'userId': 2, 'id': 2, 'title': 4, 'completed': 2}
 

Комментарии:

1. вы также можете напрямую использовать понимание набора len({x['userId'] for x in todos})

Ответ №2:

вы можете сделать следующее без импорта pandas:

 todos = [{'userId': 1, 'id': 1, 'title': 'A', 'completed': False},
     {'userId': 1, 'id': 2, 'title': 'B ', 'completed': False},
     {'userId': 1, 'id': 1, 'title': 'C', 'completed': False},
     {'userId': 1, 'id': 2, 'title': 'A', 'completed': True},
     {'userId': 2, 'id': 1,'title': 'B', 'completed': False}]
from collections import defaultdict
d = defaultdict(lambda:[])
for todo in todos:
    for k,v in todo.items():
        d[k].append(v)
d = {k:len(set(v)) for k,v in d.items()}
print(d)
 

вывод:

 {'userId': 2, 'id': 2, 'title': 4, 'completed': 2}
 

ОБЪЯСНЕНИЕ:
сначала вы создаете defaultdict, который инициализирует значения по умолчанию, когда они не существуют d = defaultdict(lambda:[])

создайте dict списков вместо dict списков

 for todo in todos:
    for k,v in todo.items():
        d[k].append(v)
 

затем вы извлекаете уникальные значения с помощью set и измеряете длину {k:len(set(v)) for k,v in d.items()} .

Ответ №3:

Вы можете использовать pandas для этого.

Просто создайте фрейм данных из todos словаря, а затем используйте nunique метод.

 import pandas as pd
todos = [{'userId': 1, 'id': 1, 'title': 'A', 'completed': False},
     {'userId': 1, 'id': 2, 'title': 'B ', 'completed': False},
     {'userId': 1, 'id': 1, 'title': 'C', 'completed': False},
     {'userId': 1, 'id': 2, 'title': 'A', 'completed': True},
     {'userId': 2, 'id': 1,'title': 'B', 'completed': False}]
df = pd.DataFrame(todos)
df['userId'].nunique()
df['title'].nunique()
df['completed'].nunique()
 

Обратите внимание, что второй заголовок B dicionay — это, а не B так, что вам может понадобиться его обработать.