【问题标题】:Formation of dictionary from list element从列表元素形成字典
【发布时间】:2016-01-08 20:24:43
【问题描述】:

您好,我有如下列表,其中包含来自图像的元数据,如下所示:

['Component 1: Y component: Quantization table 0, Sampling factors 1 horiz/1 vert', 
 'Component 2: Cb component: Quantization table 1, Sampling factors 1 horiz/1 vert', 
 'Component 3: Cr component: Quantization table 1, Sampling factors 1 horiz/1 vert', 
 'Compression Type: Progressive, Huffman', 'Content-Length: 14312', 'Content-Type: image/jpeg’]

我想使用以下格式拆分列表“:”来制作字典:

{Component 1: {Y component: [Quantization table 0, Sampling factors 1 horiz/1 vert’], 
 Component 2: {Cb component: [Quantization table 1, Sampling factors 1 horiz/1 vert]}, 
 Component 3: {Cr component: [Quantization table 1, Sampling factors 1 horiz/1 vert]}, 
 Compression Type: [Progressive, Huffman],Content-Length: 14312,Content-Type: image/jpeg}

目前我写了一些不工作的代码。

def make_dict(seq):
res = {}
if seq[0] is not '':
    for elt in seq:
        k, v = elt.split(':')
        try:
            res[k].append(v)  
        except KeyError:
            res[k] = [v]

print res

此代码不起作用。我也尝试过其他方法,但我无法获取格式。

【问题讨论】:

  • 您是否期望字典列表作为输出(如您的第一种情况)?
  • @akira,请使用复选标记按钮接受足够的答案。这对你来说值得 +2 代表。

标签: python list dictionary split


【解决方案1】:

您可以使用collections.OrderedDict 在字典推导中使用列表推导:

>>> li=['Component 1: Y component: Quantization table 0, Sampling factors 1 horiz/1 vert', 'Component 2: Cb component: Quantization table 1, Sampling factors 1 horiz/1 vert', 'Component 3: Cr component: Quantization table 1, Sampling factors 1 horiz/1 vert', 'Compression Type: Progressive, Huffman', 'Content-Length: 14312', 'Content-Type: image/jpeg']
>>> d=OrderedDict((sub[0],{sub[1]:sub[2:]}) if sub[2:] else (sub[0],sub[1]) for sub in [item.split(':') for item in li])
>>> d
OrderedDict([('Component 1', {' Y component': [' Quantization table 0, Sampling factors 1 horiz/1 vert']}), ('Component 2', {' Cb component': [' Quantization table 1, Sampling factors 1 horiz/1 vert']}), ('Component 3', {' Cr component': [' Quantization table 1, Sampling factors 1 horiz/1 vert']}), ('Compression Type', ' Progressive, Huffman'), ('Content-Length', ' 14312'), ('Content-Type', ' image/jpeg')])
>>> 

【讨论】:

    【解决方案2】:

    您可以使用递归和拆分限制优雅地解决问题(split 的第二个参数可用于限制拆分计数):

    def make_dict(l):
        d = dict()
        for elem in l:
            key, value = elem.split(':', 1)
            if ':' in value:
                d[key] = make_dict([value])
            else:
                d[key] = value
        return d
    

    而且测试似乎符合您的期望:

    >>> l = ['Component 1: Y component: Quantization table 0, Sampling factors 1 horiz/1 vert',
         'Component 2: Cb component: Quantization table 1, Sampling factors 1 horiz/1 vert',
         'Component 3: Cr component: Quantization table 1, Sampling factors 1 horiz/1 vert',
         'Compression Type: Progressive, Huffman', 'Content-Length: 14312', 'Content-Type: image/jpeg']
    >>> make_dict(l)
    {'Component 1': {' Y component': ' Quantization table 0, Sampling factors 1 horiz/1 vert'},
     'Component 2': {' Cb component': ' Quantization table 1, Sampling factors 1 horiz/1 vert'},
     'Component 3': {' Cr component': ' Quantization table 1, Sampling factors 1 horiz/1 vert'},
     'Compression Type': ' Progressive, Huffman',
     'Content-Length': ' 14312',
     'Content-Type': ' image/jpeg'}
    

    【讨论】:

    • 非常感谢。它真的很有帮助
    【解决方案3】:
    l = ['Component 1: Y component: Quantization table 0, Sampling factors 1 horiz/1 vert',
         'Component 2: Cb component: Quantization table 1, Sampling factors 1 horiz/1 vert',
         'Component 3: Cr component: Quantization table 1, Sampling factors 1 horiz/1 vert',
         'Compression Type: Progressive, Huffman', 'Content-Length: 14312', 'Content-Type: image/jpeg']
    
    d = {}
    
    for ele in l:
        spl = ele.split(":", 2)
        if len(spl) == 3:
            k1, k2, v = spl
            d[k1] = {k2: v.split(",")}
        else:
            k,v = spl
            d[k] =   v.split() if "," in v  else v
    

    输出:

    {'Component 1': {' Y component': [' Quantization table 0',
                                      ' Sampling factors 1 horiz/1 vert']},
     'Component 2': {' Cb component': [' Quantization table 1',
                                       ' Sampling factors 1 horiz/1 vert']},
     'Component 3': {' Cr component': [' Quantization table 1',
                                       ' Sampling factors 1 horiz/1 vert']},
     'Compression Type': [' Progressive', ' Huffman'],
     'Content-Length': ' 14312',
     'Content-Type': ' image/jpeg'}
    

    要删除空格,您可以str.strip 将其关闭:

    d = {}
    
    for ele in l:
        spl = ele.split(":", 2)
        if len(spl) == 3:
            k1, k2, v = spl
            d[k1] = {k2.strip(): list(map(str.strip,v.split(",")))}
        else:
            k,v = spl
            d[k] = list(map(str.strip, v.split())) if "," in v  else v.strip
    

    输出:

    {'Component 1': {'Y component': ['Quantization table 0',
                                     'Sampling factors 1 horiz/1 vert']},
     'Component 2': {'Cb component': ['Quantization table 1',
                                      'Sampling factors 1 horiz/1 vert']},
     'Component 3': {'Cr component': ['Quantization table 1',
                                      'Sampling factors 1 horiz/1 vert']},
     'Compression Type': ['Progressive', 'Huffman'],
     'Content-Length': '14312',
     'Content-Type': 'image/jpeg'}
    

    两者实际上都符合您的预期输出。

    【讨论】:

      【解决方案4】:

      如果您想处理任何级别的字典嵌套,您可以使用如下所示的递归算法。示例 -

      def makedict(elem):
          if ':' in elem:
              k,v = map(str.strip, elem.split(':',1))
              return {k:makedict(v)}
          elif ',' in elem:
              elems = list(map(str.strip, elem.split(','))) #Simply map(...) for Python 2.x
              return elems
          return elem
      

      如果你想制作一本字典,你可以这样做 -

      d = {}
      for elem in s:
          d.update(makedict(elem))
      

      或者,如果您想要一个字典列表,请在列表理解中为列表中的每个元素调用上述函数,例如 -

      result = [makedict(elem) for elem in yourlist]
      

      字典词典演示 -

      >>> d = {}
      >>> for elem in s:
      ...     d.update(makedict(elem))
      ...
      >>> d
      {'Component 2': {'Cb component': ['Quantization table 1', 'Sampling fac
      >>> import pprint
      >>> pprint.pprint(d)
      {'Component 1': {'Y component': ['Quantization table 0',
                                       'Sampling factors 1 horiz/1 vert']},
       'Component 2': {'Cb component': ['Quantization table 1',
                                        'Sampling factors 1 horiz/1 vert']},
       'Component 3': {'Cr component': ['Quantization table 1',
                                        'Sampling factors 1 horiz/1 vert']},
       'Compression Type': ['Progressive', 'Huffman'],
       'Content-Length': '14312',
       'Content-Type': 'image/jpeg'}
      

      【讨论】:

      • 递归处理任何级别的字典嵌套
      • 我猜{Component 1 : { Y component : 的意思是 dict 的 dict。
      • 当然,我这样做很简单,将逻辑从 list comp 更改为创建字典字典的字典,如上例中更新的那样
      猜你喜欢
      • 1970-01-01
      • 2017-09-16
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      • 2018-09-06
      • 1970-01-01
      • 2014-02-10
      相关资源
      最近更新 更多