2016-05-17 8 views
2

私はリスト内にネストされた辞書を使ってプログラムを書いています。リストをループするときに各辞書の名前を表示したいが、辞書の内容全体を呼び出すことなくその方法を知らない。ここに私のコードは次のとおりです。ここでネストされた辞書の名前を使用するにはどうすればよいですか?

sam = { 
'food' : 'tortas', 
'country' : 'mexico', 
'song' : 'Dream On', 
} 
dave = { 
    'food' : 'spaghetti', 
    'country' : 'USA', 
    'song' : 'Sweet Home Alabama', 
    } 

people = [sam, dave] 

for person in people: 
    for key, value in sorted(person.items()): 
     print(#person's name + 
       "'s favorite " + key + " is " + value + ".") 

が出力されます。

's favorite country is mexico. 

's favorite food is tortas. 

's favorite song is Dream On. 

's favorite country is USA. 

's favorite food is spaghetti. 

's favorite song is Sweet Home Alabama. 

すべてが動作しますが、私はちょうど印刷する私の辞書の名前を必要としています。解決策は何ですか?

+2

オブジェクトにはその意味で "名前"がありません。 'bob = dave'のようなことができますし、同じオブジェクトには2つの名前があります。そのようなものを望むなら、 '' dave''と '' sam''をキーにして、入れ子の別のレイヤーを追加してください。 – BrenBarn

答えて

1

リストの値は実際にはの変数ではありません。これらは名前空間の名前ではなく、リストの先頭からのオフセットを示す整数(01、...)によって参照されます。

dictのデータを名前と関連付けるには、明示的に行う必要があります。名前を追跡する責任に応じて、一般的な選択肢が2つあります:人物のコレクション、またはコレクションの各人物。

最初の最も簡単なのはcollections.OrderedDictです。通常のdictとは異なり、リスト内の人の順序は保持されます。

from collections import OrderedDict 

sam = { 
    'food': 'tortas', 
    'country': 'Mexico', 
    'song': 'Dream On', 
    } 
dave = { 
    'food': 'spaghetti', 
    'country': 'USA', 
    'song': 'Sweet Home Alabama', 
    } 
# The OrderedDict stores each person's name. 
people = OrderedDict([('Sam', sam), ('Dave', dave)]) 

for name, data in people.items(): 
    # Name is a key in the OrderedDict. 
    print('Name: ' + name) 
    for key, value in sorted(data.items()): 
     print(' {0}: {1}'.format(key.title(), value)) 

また、あなたはそれらの辞書の内容を変更することが許可されていると仮定すると... dict彼または彼女自身の中で一人一人の名前を格納することができます。 (また、すでにデータを変更/更新する必要があるデータ・ディクショナリには何も追加したくないのですが、ほとんどの人が自分の好きな食べ物や曲を自分の名前を変更するよりも頻繁に変更するため、おそらく安全です。)

sam = { 
# Each dict has a new key: 'name'. 
    'name': 'Sam', 
    'food': 'tortas', 
    'country': 'Mexico', 
    'song': 'Dream On', 
    } 
dave = { 
    'name': 'Dave', 
    'food': 'spaghetti', 
    'country': 'USA', 
    'song': 'Sweet Home Alabama', 
    } 
people = [sam, dave] 

for data in people: 
    # Name is a value in the dict. 
    print('Name: ' + data['name']) 
    for key, value in sorted(data.items()): 
     # Have to avoid printing the name again. 
     if 'name' != key: 
      print(' {0}: {1}'.format(key.title(), value)) 

注意を使用すると、データはあなたがコレクション(OrderedDictバリアント)で、または各個人のdictlistバリアント)に名前を保存するかどうかに依存して印刷するかということ。

3

これをする(それ以上)の正しい方法は、次のような、代わりdictdictのSを構築することである。

people = {'sam': {'food' : 'tortas', 
        'country' : 'mexico', 
        'song' : 'Dream On', 
        }, 
      'dave': {'food' : 'spaghetti', 
        'country' : 'USA', 
        'song' : 'Sweet Home Alabama', 
        } 
      } 

その後、あなたは、単に次の操作を実行できます。

for name, person in people.items(): 
    for key, value in sorted(person.items()): 
     print(name + "'s favorite " + key + " is " + value + ".") 

この意志以下を印刷してください。

dave's favorite country is USA. 
dave's favorite food is spaghetti. 
dave's favorite song is Sweet Home Alabama. 
sam's favorite country is mexico. 
sam's favorite food is tortas. 
sam's favorite song is Dream On. 

注釈として、あなたのprint文で文字列フォーマットを使用する:あなたは基本的にやろうとしているもの

print("{0}'s favorite {1} is {2}".format(name, key, value)) 
2

は、変数の名前を印刷しています。もちろん、これはお勧めしません。あなたが本当にこれをしたい場合は、この投稿を見てください: How can you print a variable name in python?

私は何をするだろう、リスト内の辞書の名前を格納することです。あなたは 'people = [sam、dave]'を 'people = [[sam]、sam]、[dave]、dave]'に変更することでこれを行うことができます。このようにして、person [0]は人物の名前であり、person [1]は情報を含みます。

2

最も簡単な方法は、一致する変数識別子にマッピングし、文字列として名前を格納することです:

people = {'sam':sam, 'dave':dave} 

for name, person in people.items(): 
    for key, value in sorted(person.items()): 
     print(name + "'s favorite " + key + " is " + value + ".") 

あなたが本当に二回それぞれの名前を入力するという考えが気に入らない場合、あなたは「インライン」可能性辞書:

:あなたがグローバル名前空間にあるこれらの変数に依存しており、実際の純度よりもちょうどそれが動作することで、より懸念していることができるかどう

people = { 
    'sam':{ 
     'food' : 'tortas', 
     'country' : 'mexico', 
     'song' : 'Dream On', 
    }, 
    'dave':{ 
     'food' : 'spaghetti', 
     'country' : 'USA', 
     'song' : 'Sweet Home Alabama', 
    } 
} 

最後に、あなたは彼らにこの方法を見つけることができます

people = ['sam', 'dave'] 

for name in people: 
    person = globals()[name] 
    for key, value in sorted(person.items()): 
     print(name + "'s favorite " + key + " is " + value + ".") 
0

大変ありがとうございます。このプログラムは、Eric Matthesの "Python Crash Course"の実践例です。非効率的な "リスト内の辞書"形式は意図的です。それは言った、私はあなたのコメントのうちの多くを得て、所望の出力を得るために私のコードを変更:ここで

sam = { 
    #Added a 'name' key-value pair. 
    'name' : 'sam', 
    'food' : 'tortas', 
    'country' : 'mexico', 
    'song' : 'Dream On', 
    } 
dave = { 
    'name' : 'dave', 
    'food' : 'spaghetti', 
    'country' : 'USA', 
    'song' : 'Sweet Home Alabama', 
    } 

people = [sam, dave] 

for person in people: 
    for key, value in sorted(person.items()): 
     #Added if statement to prevent printing the name. 
     if key != 'name': 
      print(person['name'].title() + "'s favorite " + key + " is " + value + ".") 
    #Added a blank line at the end of each for loop. 
    print('\n') 

を出力は、次のとおりです。

Sam's favorite country is mexico. 
Sam's favorite food is tortas. 
Sam's favorite song is Dream On. 


Dave's favorite country is USA. 
Dave's favorite food is spaghetti. 
Dave's favorite song is Sweet Home Alabama. 

おかげで再び、すべての洞察に満ちた答えを提供する人。

関連する問題