python命名为字典的元组

Wit*_*eso 126 python dictionary tuples namedtuple

我在python中有一个名为tuple的类

class Town(collections.namedtuple('Town', [
    'name', 
    'population',
    'coordinates',
    'population', 
    'capital', 
    'state_bird'])):
    # ...
Run Code Online (Sandbox Code Playgroud)

我想做的是将其变成字典.我承认python不是我强大的语言之一.关键是我不希望它与我所拥有的字段的名称或数字紧密相关.

有没有办法写它,以便我可以添加更多的字段,或传递一个完全不同的命名元组并获取字典.

编辑:我不能改变原来的类定义,因为它在别人的代码中.所以我需要一个城镇的实例并将其转换为字典.

wim*_*wim 227

TL; DR:_asdict为此提供了一种方法.

以下是用法演示:

>>> fields = ['name', 'population', 'coordinates', 'capital', 'state_bird']
>>> Town = collections.namedtuple('Town', fields)
>>> funkytown = Town('funky', 300, 'somewhere', 'lipps', 'chicken')
>>> funkytown._asdict()
OrderedDict([('name', 'funky'),
             ('population', 300),
             ('coordinates', 'somewhere'),
             ('capital', 'lipps'),
             ('state_bird', 'chicken')])
Run Code Online (Sandbox Code Playgroud)

这是一个有记录的命名元组的方法,即与python中的通常约定不同,方法名称的前导下划线不能阻止使用.随着加入namedtuples其他方法,_make,_replace,_source,_fields,它有下划线只尝试和防止可能的字段名的冲突.


注意: 对于一些2.7.5 <python version <3.5.0代码,你可能会看到这个版本:

>>> vars(funkytown)
OrderedDict([('name', 'funky'),
             ('population', 300),
             ('coordinates', 'somewhere'),
             ('capital', 'lipps'),
             ('state_bird', 'chicken')])
Run Code Online (Sandbox Code Playgroud)

有一段时间文档提到_asdict过时(见这里),并建议使用内置方法变量.这个建议现在已经过时了; 为了修复与子类相关的错误__dict__,此提交再次删除了namedtuples上存在的属性.

  • @KobeJohn 那么你不能让 `"asdict"` 成为元组名称之一。 (5认同)
  • 有谁知道是否有既定的先例表明“_asdict”不应在标准库中别名为“asdict”? (2认同)

Pet*_*per 24

namedtuple这个实例上有一个内置的方法,_asdict.

正如评论中所讨论的那样,某些版本vars()也会这样做,但它显然高度依赖于构建细节,而_asdict应该是可靠的.在某些版本中_asdict被标记为已弃用,但注释表明从3.4开始不再是这种情况.

  • 只是抬起头来:_asdict不长obseleted(而现在返回OrderedDict)和VAR产生与Python 3.4的错误(从去除namedtuples的__dict__属性). (7认同)

sad*_*med 9

通常_asdict()返回一个OrderedDict. 这是如何从转换OrderedDict为常规dict


town = Town('funky', 300, 'somewhere', 'lipps', 'chicken')
dict(town._asdict())
Run Code Online (Sandbox Code Playgroud)

输出将是

{'capital': 'lipps',
 'coordinates': 'somewhere',
 'name': 'funky',
 'population': 300,
 'state_bird': 'chicken'}
Run Code Online (Sandbox Code Playgroud)

  • 这不再是必要的了。从 Python 3.8 开始,`_asdict()` 返回一个 `dict` 而不是 `OrderedDict` (4认同)