Pythonic将dicts列表转换为namedtuples列表的方法

scr*_*esh 7 python algorithm dictionary list

我有一个listdict.需要将其转换listnamedtuple(首选)或简单,tuple同时用空格分割第一个变量.

什么是pythonic方式呢?

我简化了我的代码.欢迎使用理解,gen表达式和itertools.

数据在:

dl = [{'a': '1 2 3',
       'd': '*',
       'n': 'first'},
      {'a': '4 5',
       'd': '*', 'n':
       'second'},
      {'a': '6',
       'd': '*',
       'n': 'third'},
      {'a': '7 8 9 10',
       'd': '*',
       'n': 'forth'}]
Run Code Online (Sandbox Code Playgroud)

简单的算法:

from collections import namedtuple

some = namedtuple('some', ['a', 'd', 'n'])

items = []
for m in dl:
    a, d, n = m.values()
    a = a.split()
    items.append(some(a, d, n))
Run Code Online (Sandbox Code Playgroud)

输出:

[some(a=['1', '2', '3'], d='*', n='first'),
 some(a=['4', '5'], d='*', n='second'),
 some(a=['6'], d='*', n='third'),
 some(a=['7', '8', '9', '10'], d='*', n='forth')]
Run Code Online (Sandbox Code Playgroud)

det*_*tly 7

下面,@ Petr Viktorin指出我的原始答案和您的初始解决方案的问题:

警告!字典的values()没有任何特定的顺序!如果这个解决方案有效,并且a,d,n确实按顺序返回,那只是巧合.如果您使用不同版本的Python或以不同的方式创建dicts,它可能会破坏.

(我有点羞愧,我一开始没有接受这个,并获得了45个代表!)

请改用@ eryksun的建议:

items =  [some(m['a'].split(), m['d'], m['n']) for m in dl]
Run Code Online (Sandbox Code Playgroud)

我原来的错误答案.除非你有一份清单,否则不要使用它OrderedDict.

items =  [some(a.split(), d, n) for a,d,n in (m.values() for m in dl)]
Run Code Online (Sandbox Code Playgroud)

  • 警告!字典的`values()`[以任何特定的顺序排列*](http://docs.python.org/library/stdtypes.html#dict.items)!如果这个解决方案有效,并且`a,d,n`确实按顺序返回,那只是巧合.如果您使用不同版本的Python或以不同的方式创建dicts,它可能会破坏.直接使用密钥,如@ eryksun的评论. (2认同)
  • 我发现 `namedtuple('xxx', d.keys())(**d)` 非常方便。 (2认同)