【问题标题】:Create sub list from list of dictionary and update values of dictionary从字典列表创建子列表并更新字典的值
【发布时间】:2022-01-16 03:21:23
【问题描述】:

我有一个字典列表:-

test = [{'Sequence': 'A', 'Tag': '20', 'Option': None},
        {'Sequence': 'A', 'Tag': '23', 'Option': None},
        {'Sequence': 'A', 'Tag': '51A', 'Option': None},
        {'Sequence': 'A', 'Tag': '50A', 'Option': 'A'},
        {'Sequence': 'A', 'Tag': '50A', 'Option': 'F'},
        {'Sequence': 'A', 'Tag': '50A', 'Option': 'K'},
        {'Sequence': 'A', 'Tag': '52A', 'Option': 'A'},
        {'Sequence': 'A', 'Tag': '52A', 'Option': 'B'},
        {'Sequence': 'A', 'Tag': '52A', 'Option': 'C'},
        {'Sequence': 'A', 'Tag': '26T', 'Option': None},
        {'Sequence': 'A', 'Tag': '77B', 'Option': None},
        {'Sequence': 'A', 'Tag': '71A', 'Option': None},
        {'Sequence': 'B', 'Tag': '36', 'Option': None},
        {'Sequence': 'B', 'Tag': '21', 'Option': None},
        {'Sequence': 'B', 'Tag': '32B', 'Option': None},
        {'Sequence': 'B', 'Tag': '32B', 'Option': None},
        {'Sequence': 'B', 'Tag': '50A', 'Option': 'A'},
        {'Sequence': 'B', 'Tag': '50A', 'Option': 'F'},
        {'Sequence': 'B', 'Tag': '50A', 'Option': 'K'},
        {'Sequence': 'B', 'Tag': '52A', 'Option': 'A'},
        {'Sequence': 'B', 'Tag': '52A', 'Option': 'B'},
        {'Sequence': 'B', 'Tag': '52A', 'Option': 'C'},
        {'Sequence': 'B', 'Tag': '57A', 'Option': 'A'},
        {'Sequence': 'B', 'Tag': '57A', 'Option': 'C'},
        {'Sequence': 'B', 'Tag': '59A', 'Option': None},
        {'Sequence': 'B', 'Tag': '59A', 'Option': 'A'},
        {'Sequence': 'B', 'Tag': '59A', 'Option': 'F'},
        {'Sequence': 'B', 'Tag': '70', 'Option': None},
        {'Sequence': 'B', 'Tag': '26T', 'Option': None},
        {'Sequence': 'B', 'Tag': '77B', 'Option': None},
        {'Sequence': 'B', 'Tag': '33B', 'Option': None},
        {'Sequence': 'B', 'Tag': '33B', 'Option': None},
        {'Sequence': 'B', 'Tag': '71A', 'Option': None},
        {'Sequence': 'B', 'Tag': '71F', 'Option': None},
        {'Sequence': 'B', 'Tag': '71F', 'Option': None},
        {'Sequence': 'B', 'Tag': '71G', 'Option': None},
        {'Sequence': 'B', 'Tag': '71G', 'Option': None},
        {'Sequence': 'B', 'Tag': '36', 'Option': None},
        {'Sequence': 'C', 'Tag': '32A', 'Option': None},
        {'Sequence': 'C', 'Tag': '32A', 'Option': None},
        {'Sequence': 'C', 'Tag': '32A', 'Option': None},
        {'Sequence': 'C', 'Tag': '19', 'Option': None},
        {'Sequence': 'C', 'Tag': '71G', 'Option': None},
        {'Sequence': 'C', 'Tag': '71G', 'Option': None},
        {'Sequence': 'C', 'Tag': '13C', 'Option': None},
        {'Sequence': 'C', 'Tag': '53A', 'Option': 'A'},
        {'Sequence': 'C', 'Tag': '53A', 'Option': 'C'},
        {'Sequence': 'C', 'Tag': '54A', 'Option': None},
        {'Sequence': 'C', 'Tag': '72', 'Option': None}]

我可以根据“序列”键创建一个单独的字典列表:

sorted_data = sorted(test, key=itemgetter('Sequence'))

for key, group in itertools.groupby(sorted_data, key=lambda x: x['Sequence']):
    print(key, list(group))

A [{'Sequence': 'A', 'Tag': '20', 'Option': None}, {'Sequence': 'A', 'Tag': '23', 'Option': None}, {'Sequence': 'A', 'Tag': '51A', 'Option': None}, {'Sequence': 'A', 'Tag': '50A', 'Option': 'A'}, {'Sequence': 'A', 'Tag': '50A', 'Option': 'F'}, {'Sequence': 'A', 'Tag': '50A', 'Option': 'K'}, {'Sequence': 'A', 'Tag': '52A', 'Option': 'A'}, {'Sequence': 'A', 'Tag': '52A', 'Option': 'B'}, {'Sequence': 'A', 'Tag': '52A', 'Option': 'C'}, {'Sequence': 'A', 'Tag': '26T', 'Option': None}, {'Sequence': 'A', 'Tag': '77B', 'Option': None}, {'Sequence': 'A', 'Tag': '71A', 'Option': None}]
B [{'Sequence': 'B', 'Tag': '36', 'Option': None}, {'Sequence': 'B', 'Tag': '21', 'Option': None}, {'Sequence': 'B', 'Tag': '32B', 'Option': None}, {'Sequence': 'B', 'Tag': '32B', 'Option': None}, {'Sequence': 'B', 'Tag': '50A', 'Option': 'A'}, {'Sequence': 'B', 'Tag': '50A', 'Option': 'F'}, {'Sequence': 'B', 'Tag': '50A', 'Option': 'K'}, {'Sequence': 'B', 'Tag': '52A', 'Option': 'A'}, {'Sequence': 'B', 'Tag': '52A', 'Option': 'B'}, {'Sequence': 'B', 'Tag': '52A', 'Option': 'C'}, {'Sequence': 'B', 'Tag': '57A', 'Option': 'A'}, {'Sequence': 'B', 'Tag': '57A', 'Option': 'C'}, {'Sequence': 'B', 'Tag': '59A', 'Option': None}, {'Sequence': 'B', 'Tag': '59A', 'Option': 'A'}, {'Sequence': 'B', 'Tag': '59A', 'Option': 'F'}, {'Sequence': 'B', 'Tag': '70', 'Option': None}, {'Sequence': 'B', 'Tag': '26T', 'Option': None}, {'Sequence': 'B', 'Tag': '77B', 'Option': None}, {'Sequence': 'B', 'Tag': '33B', 'Option': None}, {'Sequence': 'B', 'Tag': '33B', 'Option': None}, {'Sequence': 'B', 'Tag': '71A', 'Option': None}, {'Sequence': 'B', 'Tag': '71F', 'Option': None}, {'Sequence': 'B', 'Tag': '71F', 'Option': None}, {'Sequence': 'B', 'Tag': '71G', 'Option': None}, {'Sequence': 'B', 'Tag': '71G', 'Option': None}, {'Sequence': 'B', 'Tag': '36', 'Option': None}]
C [{'Sequence': 'C', 'Tag': '32A', 'Option': None}, {'Sequence': 'C', 'Tag': '32A', 'Option': None}, {'Sequence': 'C', 'Tag': '32A', 'Option': None}, {'Sequence': 'C', 'Tag': '19', 'Option': None}, {'Sequence': 'C', 'Tag': '71G', 'Option': None}, {'Sequence': 'C', 'Tag': '71G', 'Option': None}, {'Sequence': 'C', 'Tag': '13C', 'Option': None}, {'Sequence': 'C', 'Tag': '53A', 'Option': 'A'}, {'Sequence': 'C', 'Tag': '53A', 'Option': 'C'}, {'Sequence': 'C', 'Tag': '54A', 'Option': None}, {'Sequence': 'C', 'Tag': '72', 'Option': None}]

但是,在创建上述子列表时,如果在这些情况下存在具有不同选项的重复标签,例如标签“52A”:

        {'Sequence': 'A', 'Tag': '52A', 'Option': 'A'},
        {'Sequence': 'A', 'Tag': '52A', 'Option': 'B'},
        {'Sequence': 'A', 'Tag': '52A', 'Option': 'C'}

我只想随机选择 1 个字典并更新该字典,如下所示:-

{'Sequence': 'A', 'Tag': '52B', 'Option': 'B'}

希望我能够解释这个问题。如果我需要重新考虑分解原始列表的方法,我们将不胜感激。

【问题讨论】:

    标签: python python-3.x dictionary


    【解决方案1】:

    您可以在SequenceTag 上使用groupby,并使用random.choice 从每个组中选择一项。然后再次重新排列字典以从每个键中删除 Tag,并创建一个包含 Sequence 键的字典。

    from operator import itemgetter
    from itertools import groupby
    from random import choice
    sorted_data = sorted(test, key=itemgetter('Sequence','Tag'))
    out = {}
    for key, group in groupby(sorted_data, key=itemgetter('Sequence','Tag')):
        out.setdefault(key[0],[]).append(choice(list(group)))
    

    样本输出:

    {'A': [{'Sequence': 'A', 'Tag': '20', 'Option': None},
      {'Sequence': 'A', 'Tag': '23', 'Option': None},
      {'Sequence': 'A', 'Tag': '51A', 'Option': None},
      {'Sequence': 'A', 'Tag': '50A', 'Option': 'A'},
      {'Sequence': 'A', 'Tag': '52A', 'Option': 'A'},
      {'Sequence': 'A', 'Tag': '26T', 'Option': None},
      {'Sequence': 'A', 'Tag': '77B', 'Option': None},
      {'Sequence': 'A', 'Tag': '71A', 'Option': None}],
     'B': [{'Sequence': 'B', 'Tag': '36', 'Option': None},
      {'Sequence': 'B', 'Tag': '21', 'Option': None},
      {'Sequence': 'B', 'Tag': '32B', 'Option': None},
      {'Sequence': 'B', 'Tag': '50A', 'Option': 'K'},
      {'Sequence': 'B', 'Tag': '52A', 'Option': 'C'},
      {'Sequence': 'B', 'Tag': '57A', 'Option': 'C'},
      {'Sequence': 'B', 'Tag': '59A', 'Option': 'A'},
      {'Sequence': 'B', 'Tag': '70', 'Option': None},
      {'Sequence': 'B', 'Tag': '26T', 'Option': None},
      {'Sequence': 'B', 'Tag': '77B', 'Option': None},
      {'Sequence': 'B', 'Tag': '33B', 'Option': None},
      {'Sequence': 'B', 'Tag': '71A', 'Option': None},
      {'Sequence': 'B', 'Tag': '71F', 'Option': None},
      {'Sequence': 'B', 'Tag': '71G', 'Option': None}],
     'C': [{'Sequence': 'C', 'Tag': '32A', 'Option': None},
      {'Sequence': 'C', 'Tag': '19', 'Option': None},
      {'Sequence': 'C', 'Tag': '71G', 'Option': None},
      {'Sequence': 'C', 'Tag': '13C', 'Option': None},
      {'Sequence': 'C', 'Tag': '53A', 'Option': 'A'},
      {'Sequence': 'C', 'Tag': '54A', 'Option': None},
      {'Sequence': 'C', 'Tag': '72', 'Option': None}]}
    

    【讨论】:

      【解决方案2】:

      使用random.choicecollections.defaultdict 的一种方式:

      from itertools import groupby
      from random import choice
      from collections import defaultdict
      
      res = defaultdict(list)
      
      for (seq, tag), g in groupby(test, key=lambda x: (x["Sequence"], x["Tag"])):
          res[seq].append(choice(list(g)))
      

      输出:

      defaultdict(list,
                  {'A': [{'Sequence': 'A', 'Tag': '20', 'Option': None},
                    {'Sequence': 'A', 'Tag': '23', 'Option': None},
                    {'Sequence': 'A', 'Tag': '51A', 'Option': None},
                    {'Sequence': 'A', 'Tag': '50A', 'Option': 'F'},
                    {'Sequence': 'A', 'Tag': '52A', 'Option': 'B'},
                    {'Sequence': 'A', 'Tag': '26T', 'Option': None},
                    {'Sequence': 'A', 'Tag': '77B', 'Option': None},
                    {'Sequence': 'A', 'Tag': '71A', 'Option': None}],
                   'B': [{'Sequence': 'B', 'Tag': '36', 'Option': None},
                    {'Sequence': 'B', 'Tag': '21', 'Option': None},
                    {'Sequence': 'B', 'Tag': '32B', 'Option': None},
                    {'Sequence': 'B', 'Tag': '50A', 'Option': 'A'},
                    {'Sequence': 'B', 'Tag': '52A', 'Option': 'C'},
                    {'Sequence': 'B', 'Tag': '57A', 'Option': 'C'},
                    {'Sequence': 'B', 'Tag': '59A', 'Option': 'A'},
                    {'Sequence': 'B', 'Tag': '70', 'Option': None},
                    {'Sequence': 'B', 'Tag': '26T', 'Option': None},
                    {'Sequence': 'B', 'Tag': '77B', 'Option': None},
                    {'Sequence': 'B', 'Tag': '33B', 'Option': None},
                    {'Sequence': 'B', 'Tag': '71A', 'Option': None},
                    {'Sequence': 'B', 'Tag': '71F', 'Option': None},
                    {'Sequence': 'B', 'Tag': '71G', 'Option': None},
                    {'Sequence': 'B', 'Tag': '36', 'Option': None}],
                   'C': [{'Sequence': 'C', 'Tag': '32A', 'Option': None},
                    {'Sequence': 'C', 'Tag': '19', 'Option': None},
                    {'Sequence': 'C', 'Tag': '71G', 'Option': None},
                    {'Sequence': 'C', 'Tag': '13C', 'Option': None},
                    {'Sequence': 'C', 'Tag': '53A', 'Option': 'C'},
                    {'Sequence': 'C', 'Tag': '54A', 'Option': None},
                    {'Sequence': 'C', 'Tag': '72', 'Option': None}]})
      

      洞察力:

      choice(list(g)) 总是返回单项,所以如果有重复的标签,它会随机选择,否则,按原样返回(因为没有重复意味着单项)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-28
        • 2018-11-06
        • 1970-01-01
        • 2018-12-17
        相关资源
        最近更新 更多