#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
так, что вам может понадобиться его обработать.