15

私はある種のレシピセレクターを作成しており、統一された辞書テンプレートを作成しようとしています。現在、次のようなものがあります。

menu_item_var = {'name': "Menu Item", 'ing': (ingredients)}

name私は再入力とingfor every を心配していmenu_item_varます. 消去にMenu Itemアイテム 0 を追加し、ループを実行して辞書をより安全にすることができることはわかっていますが、それではオリジナルを aから に変換できません。これを行う「よりスマートな」方法はありますか?tuple,dictformenu_item_vartupledict

4

7 に答える 7

3

非常に基本的な dict テンプレートを作成するために、json と文字列補間を試してみることができます。

import json
template = '{"name": "Menu Item", "ing": %s }'

def render(value):
    return json.loads(template % json.dumps(value))

render([1,2,3])
>> {u'ing': [1, 2, 3], u'name': u'Menu Item'}
于 2017-08-18T01:37:48.013 に答える
2

ディクショナリはキーと値のマッピングであり、一般に柔軟な構造を持つために使用されます。クラス インスタンスは、一連のプロパティを持つオブジェクトであり、通常、すべてが同様の構造を持つ多数のオブジェクトがある場合に使用されます。

あなたの「辞書テンプレート」は、実際にはクラスのように聞こえます (そして、この単一のテンプレートに適合する必要があるすべての辞書は、クラスのインスタンスになります)。これらの辞書を、キーと値のペアの未知のセットのコレクションにしないようにするためです。ただし、既知の名前で特定の標準的な値のセットを含める必要があります。

collections.namedtupleは、まさにこの種のクラス (インスタンスが特定のフィールド セットを持つ単なるオブジェクトであるクラス) を構築して使用するための非常に軽量な方法です。例:

>>> from collections import namedtuple
>>> MenuItem = namedtuple('MenuItem', ['name', 'ing'])
>>> thing = MenuItem("Pesto", ["Basil", "Olive oil", "Pine nuts", "Garlic"])
>>> print thing
MenuItem(name='Pesto', ing=['Basil', 'Olive oil', 'Pine nuts', 'Garlic'])
>>> thing.name
'Pesto'
>>> thing.ing
['Basil', 'Olive oil', 'Pine nuts', 'Garlic']

「欠点」は、それらがまだタプルであり、不変であることです。私の経験では、これは通常、小さくて単純なプレーンデータ オブジェクトには良いことですが、考えている使用法では欠点になる可能性があります。

于 2013-10-30T04:58:28.167 に答える