Python分组依据

发布于 2021-01-29 17:09:32

假设我有一组数据对,其中 索引0 是值, 索引1 是类型:

input = [
          ('11013331', 'KAT'), 
          ('9085267',  'NOT'), 
          ('5238761',  'ETH'), 
          ('5349618',  'ETH'), 
          ('11788544', 'NOT'), 
          ('962142',   'ETH'), 
          ('7795297',  'ETH'), 
          ('7341464',  'ETH'), 
          ('9843236',  'KAT'), 
          ('5594916',  'ETH'), 
          ('1550003',  'ETH')
        ]

我想按它们的类型(按第一个索引字符串)将它们分组:

result = [ 
           { 
             type:'KAT', 
             items: ['11013331', '9843236'] 
           },
           {
             type:'NOT', 
             items: ['9085267', '11788544'] 
           },
           {
             type:'ETH', 
             items: ['5238761', '962142', '7795297', '7341464', '5594916', '1550003'] 
           }
         ]

如何有效地做到这一点?

关注者
0
被浏览
44
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    分两步完成。首先,创建字典。

    >>> input = [('11013331', 'KAT'), ('9085267', 'NOT'), ('5238761', 'ETH'), ('5349618', 'ETH'), ('11788544', 'NOT'), ('962142', 'ETH'), ('7795297', 'ETH'), ('7341464', 'ETH'), ('9843236', 'KAT'), ('5594916', 'ETH'), ('1550003', 'ETH')]
    >>> from collections import defaultdict
    >>> res = defaultdict(list)
    >>> for v, k in input: res[k].append(v)
    ...
    

    然后,将该字典转换为预期的格式。

    >>> [{'type':k, 'items':v} for k,v in res.items()]
    [{'items': ['9085267', '11788544'], 'type': 'NOT'}, {'items': ['5238761', '5349618', '962142', '7795297', '7341464', '5594916', '1550003'], 'type': 'ETH'}, {'items': ['11013331', '9843236'], 'type': 'KAT'}]
    

    使用itertools.groupby也可以,但是它要求输入首先被排序。

    >>> sorted_input = sorted(input, key=itemgetter(1))
    >>> groups = groupby(sorted_input, key=itemgetter(1))
    >>> [{'type':k, 'items':[x[0] for x in v]} for k, v in groups]
    [{'items': ['5238761', '5349618', '962142', '7795297', '7341464', '5594916', '1550003'], 'type': 'ETH'}, {'items': ['11013331', '9843236'], 'type': 'KAT'}, {'items': ['9085267', '11788544'], 'type': 'NOT'}]
    

    请注意,这两个都不遵守键的原始顺序。如果需要保留订单,则需要一个OrderedDict。

    >>> from collections import OrderedDict
    >>> res = OrderedDict()
    >>> for v, k in input:
    ...   if k in res: res[k].append(v)
    ...   else: res[k] = [v]
    ... 
    >>> [{'type':k, 'items':v} for k,v in res.items()]
    [{'items': ['11013331', '9843236'], 'type': 'KAT'}, {'items': ['9085267', '11788544'], 'type': 'NOT'}, {'items': ['5238761', '5349618', '962142', '7795297', '7341464', '5594916', '1550003'], 'type': 'ETH'}]
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看