需要帮助使用 python 从字典列表中提取值计数

时间:2021-07-12 12:33:52

标签: python pandas list function dictionary

我希望使用 Python 计算字典列表中键的值百分比及其对应的计数以及值及其对应的计数。

使用下面的代码来提取键及其计数。需要帮助扩展它以提取值及其对应的计数。

数据如下所示:

people = [
    {"name": "Tom", "age": 10, "city": "NewYork"},
    {"name": "Mark", "age": 5, "country": "Japan"},
    {"name": "Pam", "age": 7, "city": "London"},
    {"name": "Tom", "hight": 163, "city": "California"},
    {"name": "Lena", "weight": 45, "country": "Italy"},
    {"name": "Ben", "age": 17, "city": "Colombo"},
    {"name": "Lena", "gender": "Female", "country": "Italy"},
    {"name": "Ben", "gender": "Male", "city": "Colombo"},
]


def getKeyCount(lst):
    out = {}
    for d in lst:
        for k in d.keys():
            out[k] = out.get(k, 0) + 1
    return out


def getValCount(lst):
    out = {}
    for d in lst:
        for v in d.values():
            out[v] = out.get(v, 0) + 1
    return out


getKeyCount(people)
# {'name': 8, 'age': 4, 'city': 5, 'country': 3,
# 'hight': 1, 'weight': 1, 'gender': 2}

getValCount(people)
# {'Tom': 2, 'NewYork': 1, 'Mark': 1, 'Japan': 1, 'Pam': 1,
# 'London': 1, 'California': 1, etc.}

我想要这样的输出:

Name: 10
'Tom': 2, 'Mark': 3, 'Pam': 1,'Lena': 3, 'Ben': 2
City:4
'London': 1, 'California': 1, 'NewYork': 2

我是新手,有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

试试:

from collections import Counter, defaultdict

people = [
    {"name": "Tom", "age": 10, "city": "NewYork"},
    {"name": "Mark", "age": 5, "country": "Japan"},
    {"name": "Pam", "age": 7, "city": "London"},
    {"name": "Tom", "hight": 163, "city": "California"},
    {"name": "Lena", "weight": 45, "country": "Italy"},
    {"name": "Ben", "age": 17, "city": "Colombo"},
    {"name": "Lena", "gender": "Female", "country": "Italy"},
    {"name": "Ben", "gender": "Male", "city": "Colombo"},
]

cnt = defaultdict(Counter)
for p in people:
    if not isinstance(p, dict):  # <-- make sure the items are dicts
        continue

    for k, v in p.items():
        cnt[k].update([v])

for k, v in cnt.items():
    print(k, sum(cnt[k].values()))
    for kk, vv in v.items():
        print("{}: {}".format(kk, vv), end=" ")
    print("\n")

打印:

name 8
Tom: 2 Mark: 1 Pam: 1 Lena: 2 Ben: 2 

age 4
10: 1 5: 1 7: 1 17: 1 

city 5
NewYork: 1 London: 1 California: 1 Colombo: 2 

country 3
Japan: 1 Italy: 2 

hight 1
163: 1 

weight 1
45: 1 

gender 2
Female: 1 Male: 1 


更新:添加了对值类型为 dict

的检查

答案 1 :(得分:0)

您可以对每个值尝试 list.count 方法以获取每个值的计数:

people = [{'name': "Tom", 'age': 10, "city" : "NewYork"},
          {'name': "Mark", 'age': 5, "country" : "Japan"},
          {'name': "Pam", 'age': 7, "city" : "London"},
          {'name': "Tom", 'hight': 163, "city" : "California"},
          {'name': "Lena", 'weight': 45, "country" : "Italy"},
          {'name': "Ben", 'age': 17, "city" : "Colombo"},
          {'name': "Lena", 'gender': "Female", "country" : "Italy"},
          {'name': "Ben", 'gender': "Male", "city" : "Colombo"}]

def getKeyCount(lst):
    out = {}
    for d in lst:
        for k in d:
            out[k] = out.get(k, []) + [d[k]]
    return out

d = getKeyCount(people)

def display(d, key):
    vals = d[key]
    print("Name:", len(vals))
    print(', '.join(f"{val}: {vals.count(val)}" for val in set(vals)))

display(d, 'name')
display(d, 'city')

输出:

Name: 8
Mark: 1, Ben: 2, Tom: 2, Pam: 1, Lena: 2
City: 5
London: 1, NewYork: 1, Colombo: 2, California: 1