Python 如何组合到具有不同场的阵列

Python 如何组合到具有不同场的阵列,python,dictionary,Python,Dictionary,第一个字典将帐户UUID作为与帐户所属的机器组UUID数组关联的键。 该数组包含为每个机器组UUID提供机器数量的字典 我想要的是每个帐户的机器数量。我如何组合这两个数据集才能得到它呢?为了确保我理解:你有两个字典。第一个从cloud_帐户映射到机器组列表。第二个从machine_组映射到一个机器列表。您需要从cloud_帐户到总机器数的映射。这个片段用简单的理解说明了如何做到这一点 { UUID('a639efb6-d4e0-4929-b309-8171bf61b508'):

第一个字典将帐户UUID作为与帐户所属的机器组UUID数组关联的键。 该数组包含为每个机器组UUID提供机器数量的字典


我想要的是每个帐户的机器数量。我如何组合这两个数据集才能得到它呢?

为了确保我理解:你有两个字典。第一个从cloud_帐户映射到机器组列表。第二个从machine_组映射到一个机器列表。您需要从cloud_帐户到总机器数的映射。这个片段用简单的理解说明了如何做到这一点

{
    UUID('a639efb6-d4e0-4929-b309-8171bf61b508'): 
        [UUID('d0576830-df96-4411-ac33-4bac597f2010'), 
        UUID('a650e642-ee41-4ab7-8ad1-797c7bdcd2aa'), 
        UUID('c0a36d2e-f7dd-4d62-abe8-c26249e52520')], 

    UUID('fd4bbf86-9803-4724-9576-d83355bdcff2'): 
        [UUID('31140d2e-15a1-4203-bdbb-55c14cd6b83a')]
}

-------

[
    {u'count': 1, u'_id': UUID('31140d2e-15a1-4203-bdbb-55c14cd6b83a')}, 
    {u'count': 17, u'_id': UUID('c0a36d2e-f7dd-4d62-abe8-c26249e52520')}, 
    {u'count': 1, u'_id': UUID('a650e642-ee41-4ab7-8ad1-797c7bdcd2aa')}, 
    {u'count': 1, u'_id': UUID('d0576830-df96-4411-ac33-4bac597f2010')}
]
印刷品:

foo = {'A': ['foo', 'bar'], 'B': ['baz']}
bar = {'foo': ['a', 'b', 'c'], 'bar': ['d'], 'baz': ['e', 'f']}

baz = {k: sum(len(bar[k2]) for k2 in v) for k, v in foo.items()}
print(baz)

您的字典我将称为
账户_dict
,您的数组我将称为
组_数组

为了加快这一速度(特别是如果您必须执行大量操作),我首先建议创建机器组UUID到机器计数的映射:

{'A': 4, 'B': 2}
现在,您已经具备了这一点,可以通过以下方式创建帐户到机器总数的映射:

group_count = {mg[u'_id']:mg[u'count'] for mg in group_array}

sum([group\u count[group]for group in account\u dict[account]])
将检查
account\u dict
中每个帐户的所有组,在我们创建的
group\u count
dict中查找它们的机器计数,并将它们全部添加到一起。

刚刚写了很长的文章,以澄清我从您的描述中得到的信息(希望这对您有所帮助):

较短:

from uuid import UUID

groups = {UUID('a639efb6-d4e0-4929-b309-8171bf61b508'):
          [UUID('d0576830-df96-4411-ac33-4bac597f2010'),
           UUID('a650e642-ee41-4ab7-8ad1-797c7bdcd2aa'),
           UUID('c0a36d2e-f7dd-4d62-abe8-c26249e52520')],
          UUID('fd4bbf86-9803-4724-9576-d83355bdcff2'): [UUID('31140d2e-15a1-4203-bdbb-55c14cd6b83a')]}

group_machines = [{u'count': 1, u'_id': UUID('31140d2e-15a1-4203-bdbb-55c14cd6b83a')},
                  {u'count': 17, u'_id': UUID(
                      'c0a36d2e-f7dd-4d62-abe8-c26249e52520')},
                  {u'count': 1, u'_id': UUID(
                      'a650e642-ee41-4ab7-8ad1-797c7bdcd2aa')},
                  {u'count': 1, u'_id': UUID('d0576830-df96-4411-ac33-4bac597f2010')}]

result_detail = {}
result_sum = {}

for group_id, machines_id in groups.items():
    for machine_id in machines_id:
        machine_count = tuple(
            filter(lambda m_details: m_details['_id'] == machine_id, group_machines))
        if machine_count:
            if group_id not in result_detail:
                result_sum[group_id] = machine_count[0][u'count']
                result_detail[group_id] = [
                    {machine_id: machine_count[0][u'count']}]
            else:
                result_sum[group_id] = result_sum[group_id] + \
                    machine_count[0][u'count']
                result_detail[group_id].append(
                    {machine_id: machine_count[0][u'count']})

print(result_detail)
#{UUID('a639efb6-d4e0-4929-b309-8171bf61b508'): [{UUID('d0576830-df96-4411-ac33-4bac597f2010'): 1}, {UUID('a650e642-ee41-4ab7-8ad1-797c7bdcd2aa'): 1}, {UUID('c0a36d2e-f7dd-4d62-abe8-c26249e52520'): 17}], UUID('fd4bbf86-9803-4724-9576-d83355bdcff2'): [{UUID('31140d2e-15a1-4203-bdbb-55c14cd6b83a'): 1}]}
print(result_sum)
#{UUID('a639efb6-d4e0-4929-b309-8171bf61b508'): 19, UUID('fd4bbf86-9803-4724-9576-d83355bdcff2'): 1}

是的,但在你给出的例子中,如果在第二个单词中,键
foo
bar
baz
where
int
s?那么
{foo':3,'bar':1,'baz':2}
?在这些int中,是机器的数量,而不是机器uuid的列表?如果是这种情况,那么只需删除理解中的
len
调用:
{k:sum(bar[k2])}
from uuid import UUID

groups = {UUID('a639efb6-d4e0-4929-b309-8171bf61b508'):
          [UUID('d0576830-df96-4411-ac33-4bac597f2010'),
           UUID('a650e642-ee41-4ab7-8ad1-797c7bdcd2aa'),
           UUID('c0a36d2e-f7dd-4d62-abe8-c26249e52520')],
          UUID('fd4bbf86-9803-4724-9576-d83355bdcff2'): [UUID('31140d2e-15a1-4203-bdbb-55c14cd6b83a')]}

group_machines = [{u'count': 1, u'_id': UUID('31140d2e-15a1-4203-bdbb-55c14cd6b83a')},
                  {u'count': 17, u'_id': UUID(
                      'c0a36d2e-f7dd-4d62-abe8-c26249e52520')},
                  {u'count': 1, u'_id': UUID(
                      'a650e642-ee41-4ab7-8ad1-797c7bdcd2aa')},
                  {u'count': 1, u'_id': UUID('d0576830-df96-4411-ac33-4bac597f2010')}]

result_detail = {}
result_sum = {}

for group_id, machines_id in groups.items():
    for machine_id in machines_id:
        machine_count = tuple(
            filter(lambda m_details: m_details['_id'] == machine_id, group_machines))
        if machine_count:
            if group_id not in result_detail:
                result_sum[group_id] = machine_count[0][u'count']
                result_detail[group_id] = [
                    {machine_id: machine_count[0][u'count']}]
            else:
                result_sum[group_id] = result_sum[group_id] + \
                    machine_count[0][u'count']
                result_detail[group_id].append(
                    {machine_id: machine_count[0][u'count']})

print(result_detail)
#{UUID('a639efb6-d4e0-4929-b309-8171bf61b508'): [{UUID('d0576830-df96-4411-ac33-4bac597f2010'): 1}, {UUID('a650e642-ee41-4ab7-8ad1-797c7bdcd2aa'): 1}, {UUID('c0a36d2e-f7dd-4d62-abe8-c26249e52520'): 17}], UUID('fd4bbf86-9803-4724-9576-d83355bdcff2'): [{UUID('31140d2e-15a1-4203-bdbb-55c14cd6b83a'): 1}]}
print(result_sum)
#{UUID('a639efb6-d4e0-4929-b309-8171bf61b508'): 19, UUID('fd4bbf86-9803-4724-9576-d83355bdcff2'): 1}
from functools import reduce
result = {group_id: reduce(lambda s, m_detail: s + m_detail[u'count'],
                           filter(lambda m_detail: m_detail[u'_id'] in machines_id,
                                  group_machines),
                           0)
          for group_id, machines_id in groups.items()}

print(result)
#{UUID('a639efb6-d4e0-4929-b309-8171bf61b508'): 19, UUID('fd4bbf86-9803-4724-9576-d83355bdcff2'): 1}