我在python中有一个名为tuple的类
class Town(collections.namedtuple('Town', [
'name',
'population',
'coordinates',
'population',
'capital',
'state_bird'])):
# ...
我想做的是把它变成字典。我承认python不是我强大的语言之一。关键是我不希望它与我所拥有的字段的名称或数字紧密相关。
有没有办法编写它,以便我可以添加更多字段,或传递一个完全不同的命名元组并获取字典。
编辑:我不能改变原来的类定义,因为它在别人的代码中。所以我需要一个城镇的实例并将其转换为字典。
答案 0 :(得分:200)
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')])
这是一个documented method的命名元组,即与python 中的常规约定不同,方法名称的前导下划线不用于阻止使用。除了添加到命名元组的其他方法_make
,_replace
,_source
,_fields
之外,它还有下划线,只是为了尝试防止与可能的字段名冲突。
注意:对于某些2.7.5< python版本< 3.5.0代码在野外,你可能会看到这个版本:
>>> vars(funkytown)
OrderedDict([('name', 'funky'),
('population', 300),
('coordinates', 'somewhere'),
('capital', 'lipps'),
('state_bird', 'chicken')])
有一段时间文档提到_asdict
已过时(请参阅here),并建议使用内置方法vars。这个建议现在已经过时了;为了修复与子类相关的a bug,this commit再次删除了在namedtuples上存在的__dict__
属性。
答案 1 :(得分:24)
namedtuple
个实例上有一个内置方法,_asdict
。
正如评论中所讨论的,某些版本vars()
也会这样做,但它显然高度依赖于构建细节,而_asdict
应该是可靠的。在某些版本中,_asdict
被标记为已弃用,但注释表明从3.4开始不再是这种情况。
答案 2 :(得分:1)
在Ubuntu 14.04 LTS版本的python2.7和python3.4上,$width = 100;
$height = 100;
$image = Image::make('400x800.png');
$image->width() > $image->height() ? $width=null : $height=null;
$image->resize($width, $height, function ($constraint) {
$constraint->aspectRatio();
});
$image->save('100x200.jpg', 60);
属性按预期工作。 __dict__
方法也有效,但我倾向于使用标准定义的统一属性api而不是本地化的非统一api。
$ python2.7
_asdict
看作 dict 是获取代表soemthing的字典的语义方式,(至少据我所知)。
积累一个主要python版本和平台的表以及它们对# Works on:
# Python 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2] on linux2
# Python 3.4.3 (default, Oct 14 2015, 20:28:29) [GCC 4.8.4] on linux
import collections
Color = collections.namedtuple('Color', ['r', 'g', 'b'])
red = Color(r=256, g=0, b=0)
# Access the namedtuple as a dict
print(red.__dict__['r']) # 256
# Drop the namedtuple only keeping the dict
red = red.__dict__
print(red['r']) #256
的支持会很好,目前我只有一个平台版本和两个python版本,如上所述。
__dict__
答案 3 :(得分:0)
案例1:一维元组
TUPLE_ROLES = (
(912,"Role 21"),
(913,"Role 22"),
(925,"Role 23"),
(918,"Role 24"),
)
TUPLE_ROLES[912] #==> Error because it is out of bounce.
TUPLE_ROLES[ 2] #==> will show Role 23.
DICT1_ROLE = {k:v for k, v in TUPLE_ROLES }
DICT1_ROLE[925] # will display "Role 23"
案例2:二维元组
示例:DICT_ROLES [961]#将显示“后端程序员”
NAMEDTUPLE_ROLES = (
('Company', (
( 111, 'Owner/CEO/President'),
( 113, 'Manager'),
( 115, 'Receptionist'),
( 117, 'Marketer'),
( 119, 'Sales Person'),
( 121, 'Accountant'),
( 123, 'Director'),
( 125, 'Vice President'),
( 127, 'HR Specialist'),
( 141, 'System Operator'),
)),
('Restaurant', (
( 211, 'Chef'),
( 212, 'Waiter/Waitress'),
)),
('Oil Collector', (
( 211, 'Truck Driver'),
( 213, 'Tank Installer'),
( 217, 'Welder'),
( 218, 'In-house Handler'),
( 219, 'Dispatcher'),
)),
('Information Technology', (
( 912, 'Server Administrator'),
( 914, 'Graphic Designer'),
( 916, 'Project Manager'),
( 918, 'Consultant'),
( 921, 'Business Logic Analyzer'),
( 923, 'Data Model Designer'),
( 951, 'Programmer'),
( 953, 'WEB Front-End Programmer'),
( 955, 'Android Programmer'),
( 957, 'iOS Programmer'),
( 961, 'Back-End Programmer'),
( 962, 'Fullstack Programmer'),
( 971, 'System Architect'),
)),
)
#Thus, we need dictionary/set
T4 = {}
def main():
for k, v in NAMEDTUPLE_ROLES:
for k1, v1 in v:
T4.update ( {k1:v1} )
print (T4[961]) # will display 'Back-End Programmer'
# print (T4) # will display all list of dictionary
main()
答案 4 :(得分:0)
如果没有_asdict(),则可以使用以下方式:
def to_dict(model):
new_dict = {}
keys = model._fields
index = 0
for key in keys:
new_dict[key] = model[index]
index += 1
return new_dict
答案 5 :(得分:0)
通常 _asdict()
返回 OrderedDict
。这是如何从 OrderedDict
转换为常规 dict
town = Town('funky', 300, 'somewhere', 'lipps', 'chicken')
dict(town._asdict())
输出将是
{'capital': 'lipps',
'coordinates': 'somewhere',
'name': 'funky',
'population': 300,
'state_bird': 'chicken'}
答案 6 :(得分:-5)
Python 3.将任何字段分配给字典作为字典的必需索引,我使用'name'。
import collections
Town = collections.namedtuple("Town", "name population coordinates capital state_bird")
town_list = []
town_list.append(Town('Town 1', '10', '10.10', 'Capital 1', 'Turkey'))
town_list.append(Town('Town 2', '11', '11.11', 'Capital 2', 'Duck'))
town_dictionary = {t.name: t for t in town_list}