私はPythonで名前付きタプルクラスを持っています
class Town(collections.namedtuple('Town', [
'name',
'population',
'coordinates',
'population',
'capital',
'state_bird'])):
# ...
Townインスタンスを辞書に変換したいと思います。町のフィールドの名前や数に厳密に結び付けたくありません。
フィールドを追加したり、まったく異なる名前のタプルを渡して辞書を取得したりできるように記述する方法はありますか。
元のクラス定義を他の誰かのコードのように変更することはできません。そのため、Townのインスタンスを取得して、辞書に変換する必要があります。
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')])
これは、名前付きタプルの ドキュメント化されたメソッド です。つまり、pythonの通常の規則とは異なり、メソッド名の先頭のアンダースコアはありません。 use。 namedtuplesに追加された他のメソッド_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 を使用することを提案しました。そのアドバイスは今では時代遅れです。サブクラス化に関連する バグ を修正するために、namedtuplesに存在していた__dict__
プロパティは this commit によって再び削除されました。
このためのnamedtuple
インスタンスには組み込みメソッド _asdict
があります。
コメントで説明したように、一部のバージョンではvars()
も実行しますが、ビルドの詳細に明らかに依存しているのに対し、_asdict
は信頼できるはずです。一部のバージョンでは、_asdict
は廃止予定としてマークされていましたが、コメントでは、3.4の時点ではそうではないことが示されています。
Ubuntu 14.04 LTSバージョンのpython2.7およびpython3.4では、__dict__
プロパティが期待どおりに機能しました。 _asdict
methodも機能しましたが、ローカライズされた非-制服API.
$ python2.7
# 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
dictとして見ることは、(少なくとも私の知る限りでは)soemthingを表す辞書を取得するためのセマンティックな方法です。
主要なpythonバージョンとプラットフォームの表と__dict__
のサポートを蓄積しておくといいでしょう。現在、上記のように1つのプラットフォームバージョンと2つのpythonバージョンしかありません。
| Platform | PyVer | __dict__ | _asdict |
| -------------------------- | --------- | -------- | ------- |
| Ubuntu 14.04 LTS | Python2.7 | yes | yes |
| Ubuntu 14.04 LTS | Python3.4 | yes | yes |
| CentOS Linux release 7.4.1708 | Python2.7 | no | yes |
| CentOS Linux release 7.4.1708 | Python3.4 | no | yes |
| CentOS Linux release 7.4.1708 | Python3.6 | no | yes |
ケース#1: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: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()