从字典生成对

2024-03-29 10:03:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据是一个嵌套的决策者在国家的人。下面是去掉不重要的东西后的样子:

{'DE': [{'createdTime': '2017-11-03T13:41:01.000Z',
         'fields': {'Land': 'DE', 'Teilnehmer': 'James Hunt'},
         'id': 'reccgdSZXZFvAztCT'},
        {'createdTime': '2017-11-04T12:50:21.000Z',
         'fields': {'Land': 'DE', 'Teilnehmer': 'Susie Mueller'},
         'id': 'recQhmPmTrlZzoI84'},
        {'createdTime': '2017-11-04T12:50:33.000Z',
         'fields': {'Land': 'DE', 'Teilnehmer': 'Tom Tikky'},
         'id': 'recKCh99xvQwwCmSp'}],
 'UK': [{'createdTime': '2017-11-03T13:41:01.000Z',
         'fields': {'Land': 'UK', 'Teilnehmer': 'John Doe'},
         'id': 'recFTlSMXNET6e2UX'},
        {'createdTime': '2017-11-03T14:16:00.000Z',
         'fields': {'Land': 'UK', 'Teilnehmer': 'Jane Smith'},
         'id': 'recLqDHWh14TLm30g'},
        {'createdTime': '2017-11-03T18:41:56.000Z',
         'fields': {'Land': 'UK', 'Teilnehmer': 'Claire Singer'},
         'id': 'recB8XaFb7va0lT50'}]}

以前已经按国家分类了。我现在需要建立发送方/接收方对,每个人都需要在两个对中—一个作为发送方,一个作为接收方。双方必须来自同一个国家。因此,根据上述样本数据,最终每个国家将有3对。你知道吗

所有关于输出的问题都是id。基本上我认为一个列表可以在输出中工作,但我不确定当涉及到列表中元素的顺序时,这些是否可靠。除此之外,结果可能是这样的:

[
    # DE Pairs
    ['reccgdSZXZFvAztCT', 'recQhmPmTrlZzoI84'],
    ['recQhmPmTrlZzoI84', 'recKCh99xvQwwCmSp'],
    ['recKCh99xvQwwCmSp', 'reccgdSZXZFvAztCT'],
    # UK Pairs
    ['recFTlSMXNET6e2UX', 'recLqDHWh14TLm30g'],
    ['recLqDHWh14TLm30g', 'recB8XaFb7va0lT50'],
    ['recB8XaFb7va0lT50', 'recFTlSMXNET6e2UX']
]

为了解决这个问题,我想到的每件事都涉及到for循环的几个层次,但我还是没能完成。我确信一定有一个好办法来解决这个问题。有什么想法吗?你知道吗


Tags: 数据idfieldsde国家uklandcreatedtime
2条回答
from itertools import combinations

d = {
    'DE': [{'createdTime': '2017-11-03T13:41:01.000Z',
     'fields': {'Land': 'DE', 'Teilnehmer': 'James Hunt'},
     'id': 'reccgdSZXZFvAztCT'},
    {'createdTime': '2017-11-04T12:50:21.000Z',
     'fields': {'Land': 'DE', 'Teilnehmer': 'Susie Mueller'},
     'id': 'recQhmPmTrlZzoI84'},
    {'createdTime': '2017-11-04T12:50:33.000Z',
     'fields': {'Land': 'DE', 'Teilnehmer': 'Tom Tikky'},
     'id': 'recKCh99xvQwwCmSp'}],
    'UK': [{'createdTime': '2017-11-03T13:41:01.000Z',
     'fields': {'Land': 'UK', 'Teilnehmer': 'John Doe'},
     'id': 'recFTlSMXNET6e2UX'},
    {'createdTime': '2017-11-03T14:16:00.000Z',
     'fields': {'Land': 'UK', 'Teilnehmer': 'Jane Smith'},
     'id': 'recLqDHWh14TLm30g'},
    {'createdTime': '2017-11-03T18:41:56.000Z',
     'fields': {'Land': 'UK', 'Teilnehmer': 'Claire Singer'},
     'id': 'recB8XaFb7va0lT50'}]}
l = [list(combinations((x['id'] for x in v), 2)) for v in d.values()]

给了我们

[[('recFTlSMXNET6e2UX', 'recLqDHWh14TLm30g'),
  ('recFTlSMXNET6e2UX', 'recB8XaFb7va0lT50'),
  ('recLqDHWh14TLm30g', 'recB8XaFb7va0lT50')],
 [('reccgdSZXZFvAztCT', 'recQhmPmTrlZzoI84'),
  ('reccgdSZXZFvAztCT', 'recKCh99xvQwwCmSp'),
  ('recQhmPmTrlZzoI84', 'recKCh99xvQwwCmSp')]]

编辑:

results = []
for country in d.values():
    ids = [people['id'] for people in country]
    rotated_ids = ids[1:] + ids[:1]
    for a, b in zip(ids, rotated_ids):
        results.append([a, b])

会给我们更像

[['recFTlSMXNET6e2UX', 'recLqDHWh14TLm30g'],
 ['recLqDHWh14TLm30g', 'recB8XaFb7va0lT50'],
 ['recB8XaFb7va0lT50', 'recFTlSMXNET6e2UX'],
 ['reccgdSZXZFvAztCT', 'recQhmPmTrlZzoI84'],
 ['recQhmPmTrlZzoI84', 'recKCh99xvQwwCmSp'],
 ['recKCh99xvQwwCmSp', 'reccgdSZXZFvAztCT']]

至少,如果一个国家的人口超过2人,就没有一种方法可以生产出你想要的一对。所以你需要选择一种方法来选择一对,这样每个人在每一个端上正好一次。你知道吗

一个简单的方法是让每个人都发送给国家名单中紧随其后的人。绕过去,这样最后一个人发送给第一个人,你就有了一个有效的算法。你知道吗

下面是一个列表,我认为它符合您的要求:

result = [(p[i-1]['id'], p[i]['id']) for p in data.values() for i in range(len(p))]

在理解中,p是代表一个国家的人的词典列表,ip的索引。我们允许i-1在一开始就是-1,因为这会处理“环绕”的情况,我们需要让成对按您想要的方式工作。你知道吗

相关问题 更多 >