Python列表中的计数记录

时间:2017-06-27 03:02:36

标签: python dictionary

我的list dictionaries的格式类似于:

complete_list = [{'id': 1, 'mobile': '2345', 'name': 'ABC', 'other': 'ggg'}, {'id': 2, 'mobile': '2345', 'name': 'ABC', 'other': 'hhh'}, {'id': 3, 'mobile': '3456', 'name': 'XYZ', 'other': 'ggg'}]

我希望获得基于mobile的唯一记录计数,类似于:

[{'mobile': '2345', 'name': 'ABC', 'rec_count': 2}, {'mobile': '3456', 'name': 'XYZ', 'rec_count': 1}]

我正在尝试以下代码:

unique_list = list({v.get('mobile', ''): v for v in complete_list}.values())

使用此代码,我可以获得唯一记录list。但是也不知道如何计算。

有人可以解释一下如何做到这一点?

3 个答案:

答案 0 :(得分:1)

如果您只想计算每个mobile出现的次数,最简单的方法可能是Counter

from collections import Counter

complete_list = [{'id': 1, 'mobile': '2345', 'name': 'ABC', 'other': 'ggg'}, {'id': 2, 'mobile': '2345', 'name': 'ABC', 'other': 'hhh'}, {'id': 3, 'mobile': '3456', 'name': 'XYZ', 'other': 'ggg'}]

mobile_count = Counter(i['mobile'] for i in complete_list)
print(mobiles)

打印

Counter({'2345': 2, '3456': 1})

Counter是一种特殊的dict。阅读更多here

答案 1 :(得分:1)

您可以通过list创建loop个移动设备然后unique_list来更新记录,如下所示:

complete_list = [{'id': 1, 'mobile': '2345', 'name': 'ABC', 'other': 'ggg'},
                 {'id': 2, 'mobile': '2345', 'name': 'ABC', 'other': 'hhh'},
                 {'id': 3, 'mobile': '3456', 'name': 'XYZ', 'other': 'ggg'}]
mobiles = [x['mobile'] for x in complete_list]
unique_list = list({v.get('mobile', ''): v for v in complete_list}.values())
for elem in unique_list:
    elem['rec_count'] = mobiles.count(elem['mobile'])
print unique_list

输出:

[{'mobile': '2345', 'other': 'hhh', 'rec_count': 2, 'id': 2, 'name': 'ABC'}, {'mobile': '3456', 'other': 'ggg', 'rec_count': 1, 'id': 3, 'name': 'XYZ'}]

修改

更优化的方法是使用两个for-loops来相应地更新list,或者创建一个新的list

complete_list = [{'id': 1, 'mobile': '2345', 'name': 'ABC', 'other': 'ggg'},
                 {'id': 2, 'mobile': '2345', 'name': 'ABC', 'other': 'hhh'},
                 {'id': 3, 'mobile': '3456', 'name': 'XYZ', 'other': 'ggg'}]
for i, v in enumerate(complete_list):
    rec_count = 1
    for j, v2 in enumerate(complete_list):
        if i != j and v['mobile'] == v2['mobile']:
            rec_count += 1
            del complete_list[j]
    v['rec_count'] = rec_count
print complete_list

输出:

[{'mobile': '2345', 'other': 'ggg', 'rec_count': 2, 'id': 1, 'name': 'ABC'}, {'mobile': '3456', 'other': 'ggg', 'rec_count': 1, 'id': 3, 'name': 'XYZ'}]

如果您要创建新的list,请移除del complete_list[j]将记录附加到第一个list

末尾的新loop

答案 2 :(得分:0)

您应该能够使用len(unique_list)获取unique_list中的元素数量。我相信这是你要找的记录数。

另一个解决方案是使用for循环并设置数学来计算唯一移动数字的数量,而不创建唯一记录列表。

complete_list = [{'id': 1, 'mobile': '2345', 'name': 'ABC', 'other': 'ggg'},
                 {'id': 2, 'mobile': '2345', 'name': 'ABC', 'other': 'hhh'},
                 {'id': 3, 'mobile': '3456', 'name': 'XYZ', 'other': 'ggg'}]

mobile_numbers = set()
for record in complete_list:
  mobile_numbers.add(record['mobile'])