Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按嵌套值筛选/分组字典_Python_Dictionary - Fatal编程技术网

Python 按嵌套值筛选/分组字典

Python 按嵌套值筛选/分组字典,python,dictionary,Python,Dictionary,以下是我掌握的一些数据的简化示例: {"id": "1234565", "fields": {"name": "john", "email":"john@example.com", "country": "uk"}} wholeo嵌套字典是地址数据的较大列表。我们的目标是从名单中随机选出一对搭档,来自同一个国家的搭档应该优先考虑。因此,我的第一个真正的问题是找到一个好方法,根据国家价值对他们进行分组 我相信有一种更聪明的方法可以做到这一点,而不是重复使用dict并将所有记录写入某个新列表/di

以下是我掌握的一些数据的简化示例:

{"id": "1234565", "fields": {"name": "john", "email":"john@example.com", "country": "uk"}}
wholeo嵌套字典是地址数据的较大列表。我们的目标是从名单中随机选出一对搭档,来自同一个国家的搭档应该优先考虑。因此,我的第一个真正的问题是找到一个好方法,根据国家价值对他们进行分组


我相信有一种更聪明的方法可以做到这一点,而不是重复使用dict并将所有记录写入某个新列表/dict?

我认为这接近您所需要的:

result = {key:[i for i in value] for key, value in itertools.groupby(people, lambda item: item["fields"]["country"])}
它的作用是按指定国家对
人员
列表中的所有人员进行分组。生成的字典将国家作为键,将未打包的分组(匹配的人)作为值。输入应为字典列表,如示例中所示:

people = [{"id": "1234565", "fields": {"name": "john", "email":"john@example.com", "country": "uk"}}, 
          {"id": "654321", "fields": {"name": "sam", "email":"sam@example.com", "country": "uk"}}]
样本输出:

>>> print(result)
>>> {'uk': [{'fields': {'name': 'john', 'email': 'john@example.com', 'country': 'uk'}, 'id': '1234565'}, {'fields': {'name': 'sam', 'email': 'sam@example.com', 'country': 'uk'}, 'id': '654321'}]}
为了获得更清晰的结果,可以调整循环结构,以便结果dict中只包含每个人的ID:

result = {key:[i["id"] for i in value] for key, value in itertools.groupby(people, lambda item: item["fields"]["country"])}
>>> print(result)
>>> {'uk': ['1234565', '654321']}
编辑:对不起,我忘了排序。在通过
groupby
之前,只需按国家对人员列表进行排序。它现在应该可以正常工作了:

sort = sorted(people, key=lambda item: item["fields"]["country"])

我认为这已接近您的需要:

result = {key:[i for i in value] for key, value in itertools.groupby(people, lambda item: item["fields"]["country"])}
它的作用是按指定国家对
人员
列表中的所有人员进行分组。生成的字典将国家作为键,将未打包的分组(匹配的人)作为值。输入应为字典列表,如示例中所示:

people = [{"id": "1234565", "fields": {"name": "john", "email":"john@example.com", "country": "uk"}}, 
          {"id": "654321", "fields": {"name": "sam", "email":"sam@example.com", "country": "uk"}}]
样本输出:

>>> print(result)
>>> {'uk': [{'fields': {'name': 'john', 'email': 'john@example.com', 'country': 'uk'}, 'id': '1234565'}, {'fields': {'name': 'sam', 'email': 'sam@example.com', 'country': 'uk'}, 'id': '654321'}]}
为了获得更清晰的结果,可以调整循环结构,以便结果dict中只包含每个人的ID:

result = {key:[i["id"] for i in value] for key, value in itertools.groupby(people, lambda item: item["fields"]["country"])}
>>> print(result)
>>> {'uk': ['1234565', '654321']}
编辑:对不起,我忘了排序。在通过
groupby
之前,只需按国家对人员列表进行排序。它现在应该可以正常工作了:

sort = sorted(people, key=lambda item: item["fields"]["country"])

下面是另一个使用defaultdict的:

import collections

def make_groups(nested_dicts, nested_key):
    default = collections.defaultdict(list)
    for nested_dict in nested_dicts:
        for value in nested_dict.values():
            try:
                default[value[nested_key]].append(nested_dict)
            except TypeError:
                pass
    return default
要测试结果,请执行以下操作:

import random

COUNTRY = {'af', 'br', 'fr', 'mx', 'uk'}

people = [{'id': i, 'fields': {
                               'name': 'name'+str(i),
                               'email': str(i)+'@email',
                               'country': random.sample(COUNTRY, 1)[0]}} 
          for i in range(10)]

country_groups = make_groups(people, 'country')

for country, persons in country_groups.items():
    print(country, persons)
随机输出:

fr [{'id': 0, 'fields': {'name': 'name0', 'email': '0@email', 'country': 'fr'}}, {'id': 1, 'fields': {'name': 'name1', 'email': '1@email', 'country': 'fr'}}, {'id': 4, 'fields': {'name': 'name4', 'email': '4@email', 'country': 'fr'}}]
br [{'id': 2, 'fields': {'name': 'name2', 'email': '2@email', 'country': 'br'}}, {'id': 8, 'fields': {'name': 'name8', 'email': '8@email', 'country': 'br'}}]
uk [{'id': 3, 'fields': {'name': 'name3', 'email': '3@email', 'country': 'uk'}}, {'id': 7, 'fields': {'name': 'name7', 'email': '7@email', 'country': 'uk'}}]
af [{'id': 5, 'fields': {'name': 'name5', 'email': '5@email', 'country': 'af'}}, {'id': 9, 'fields': {'name': 'name9', 'email': '9@email', 'country': 'af'}}]
mx [{'id': 6, 'fields': {'name': 'name6', 'email': '6@email', 'country': 'mx'}}]

下面是另一个使用defaultdict的:

import collections

def make_groups(nested_dicts, nested_key):
    default = collections.defaultdict(list)
    for nested_dict in nested_dicts:
        for value in nested_dict.values():
            try:
                default[value[nested_key]].append(nested_dict)
            except TypeError:
                pass
    return default
要测试结果,请执行以下操作:

import random

COUNTRY = {'af', 'br', 'fr', 'mx', 'uk'}

people = [{'id': i, 'fields': {
                               'name': 'name'+str(i),
                               'email': str(i)+'@email',
                               'country': random.sample(COUNTRY, 1)[0]}} 
          for i in range(10)]

country_groups = make_groups(people, 'country')

for country, persons in country_groups.items():
    print(country, persons)
随机输出:

fr [{'id': 0, 'fields': {'name': 'name0', 'email': '0@email', 'country': 'fr'}}, {'id': 1, 'fields': {'name': 'name1', 'email': '1@email', 'country': 'fr'}}, {'id': 4, 'fields': {'name': 'name4', 'email': '4@email', 'country': 'fr'}}]
br [{'id': 2, 'fields': {'name': 'name2', 'email': '2@email', 'country': 'br'}}, {'id': 8, 'fields': {'name': 'name8', 'email': '8@email', 'country': 'br'}}]
uk [{'id': 3, 'fields': {'name': 'name3', 'email': '3@email', 'country': 'uk'}}, {'id': 7, 'fields': {'name': 'name7', 'email': '7@email', 'country': 'uk'}}]
af [{'id': 5, 'fields': {'name': 'name5', 'email': '5@email', 'country': 'af'}}, {'id': 9, 'fields': {'name': 'name9', 'email': '9@email', 'country': 'af'}}]
mx [{'id': 6, 'fields': {'name': 'name6', 'email': '6@email', 'country': 'mx'}}]

如果您提供了更多的数据和具有所需输出的示例案例,这将非常有帮助。如果您提供了更多的数据和具有所需输出的示例案例,这将非常有帮助。@AlexHall这可能是“吃”结果的原因吗?虽然我以前的dict中有6个条目,但我在分组的dict中只得到4个条目。排序似乎确实是这里的问题。我设法在数据进入时对其进行排序(Airtable API),但有一个python方法来完成这项工作将是非常棒的。我发现的关于OrderedDict的所有信息目前都让我负担过重。@AlexHall这可能就是它“吃”出结果的原因吗?虽然我以前的dict中有6个条目,但我在分组的dict中只得到4个条目。排序似乎确实是这里的问题。我设法在数据进入时对其进行排序(Airtable API),但有一个python方法来完成这项工作将是非常棒的。我所发现的关于OrderedDict的一切现在都让我不堪重负。