如何在字典列表中获取唯一值的计数?

问题描述 投票:0回答:1

这是我的json(词典列表)的缩写示例:

[
  {
    "product_type": "widget",
    "id": "1744556-ghh56h-4633",
    "manufacture_id": "AAB4567",
    "language": "en",
    "store_ids": [
      416835,
      456145
    ],
    "name": "Best Widget",
    "origin": "US",
    "manufactured": "2018-08-26",
    "uri": "https://bobswidgets.com/best_widget",
    "image_uris": {
      "small": "https://bobswidgets.com/small/best_widget_sm.jpg",
      "normal": "https://bobswidgets.com/medium/best_widget_md.jpg",
      "large": "https://bobswidgets.com/large/best_widget_lg.jpg"
    },
    "manufacture_cost": "12.50"
  },
  {
    "product_type": "widget",
    "id": "0956786-dje596-3904",
    "manufacture_id": "BCD13D",
    "language": "en",
    "store_ids": [
      "014329",
      "40123"
    ],
    "name": "Best Widget2",
    "origin": "US",
    "manufactured": "2018-10-03",
    "uri": "https://bobswidgets.com/best_widget_2",
    "image_uris": {
      "small": "https://bobswidgets.com/small/best_widget2_sm.jpg",
      "normal": "https://bobswidgets.com/medium/best_widget2_md.jpg",
      "large": "https://bobswidgets.com/large/best_widget2_lg.jpg"
    },
    "manufacture_cost": "13.33"
  }
]

我正在尝试计算几个关键值:值对的唯一值。我已经尝试过这个代码,并且它在为每个键提供计数方面做得很好,但由于计数几乎相同,所以这是非常无用的。

from collections import Counter
from itertools import chain

counts = Counter(chain.from_iterable(e.keys() for e in card_dict))
for key, count in counts.most_common():
    print('{}: {}'.format(key, count))

我试过这个来获取值而不是键但是得到一个错误。 TypeError: unhashable type: 'list'由于我在json文件中有id并且它们是唯一的,所以它也没用。

counts = Counter(chain.from_iterable(e.values() for e in card_dict))
for value, count in counts.most_common():
    print('{}: {}'.format(value, count))

我想要做的是在一把钥匙上做零。例如语言键:值。我想得到那些是或不是“恩”的人。

输出将是这样的:“不是英语的实体是:”语言:12345

python
1个回答
0
投票

在python中,元组是可清除的,因此你可以使用元组作为字典中的键,而且dict.items()返回(key, value)元组。使用这两个备注,如果您将count更改为:

counts = Counter(chain.from_iterable(e.items() for e in card_dict))

如果某些值实际上是值列表或简单(非嵌套)字典,那么您可以在构建Counter之前将它们转换为元组:

def tuplify(card):
    if isinstance(card, list):
        return tuple(card)
    if isinstance(card, dict):
        return tuple(card.items())
    return card

card_dict = [{k: tuplify(v) for k, v in card.items()} for card in card_dict]
© www.soinside.com 2019 - 2024. All rights reserved.