5

現在、Python dicts を扱っています。私はコードを書きました:

import random

categories = {1 : "Antics", 2 : "Tickets", 3: "Moviez",
              4 : "Music", 5 : "Photography", 6 : "Gamez", 7 : "Bookz",
              8 : "Jewelry", 9 : "Computers", 10 : "Clothes"}

items = {"Picture" : 1, "Clock" : 1, "Ticket for Mettalica concert" : 2,
         "Ticket for Iron Maiden concert" : 2, "Ticket for Placebo concert" : 2,
         "The pianist" : 3, "Batman" : 3, "Spider-Man" : 3,
         "WoW" : 6, "Cabal" : 6, "Diablo 3" : 6, "Diablo 2" : 6,
         "Thinking in Java" : 7, "Thinking in C++" : 7, "Golden ring" : 8,
         "Asus" : 10, "HP" : 10, "Shoes" : 11}

for key, val in categories :
    for k, v in items :
        if key == v :
            print(val, k)

私は次のような 3 番目の辞書を作成したかったのです。

dictThe3rd = {"Antics" : "Picture", "Antics" : "Clock", "Tickets" : "Ticket for Mettalica concert", "Ticket" : "Ticket for Iron Maiden concert", "Ticket" : "Ticket for Placebo concert", ...} 

などなど。

これを行う方法?私のコードは次のとおりです。

test.py, line 14, in <module>
    for key, val in categories :
TypeError: 'int' object is not iterable
4

3 に答える 3

6

dict を反復子として使用すると、キーと値のタプルではなく、そのキーのみが生成されます。categories.items()これらのタプルを取得するには(またはcategories.iteritems()Python 2.x のみを使用している場合) を使用する必要があります。

for key, val in categories.items() :
    for k, v in items.items() :
        if key == v :
            print(val, k)

dict 内包表記を使用して、カテゴリ名をキーとして、そのカテゴリ内のすべての項目を値として持つ dict を取得できます。

>>> dict3 = { catname : [ item for item, itemcat in items.items() if itemcat == cat  ] for cat, catname in categories.items()  }
>>> dict3
{'Antics': ['Picture', 'Clock'],
'Bookz': ['Thinking in C++', 'Thinking in Java'],
'Clothes': ['Asus', 'HP'],
'Computers': [],
'Gamez': ['Diablo 3', 'Diablo 2', 'Cabal', 'WoW'],
'Jewelry': ['Golden ring'],
'Moviez': ['The pianist', 'Batman', 'Spider-Man'],
'Music': [],
'Photography': [],
'Tickets': ['Ticket for Mettalica concert',
'Ticket for Placebo concert',
'Ticket for Iron Maiden concert']}

説明:

角括弧内の内包表記は、 のカテゴリを持つすべてのアイテムをリストしますcat。外側の内包表記はすべてのカテゴリ キーと名前を繰り返し処理し、カテゴリ名を新しい dict キーとして設定し、内側の内包表記を値として設定します。

于 2012-08-21T12:01:07.293 に答える
2

コードを次のように変更します。

for key, val in categories.iteritems():
    for k, v in items.iteritems():
        if key == v:
            print(val, k)

このようにして、アイテムイテレーターを使用してキーと値のペアを反復処理することができitems()、大きな辞書よりも優れたパフォーマンスが得られます。

あなたが望むことは次のように可能です:

import collections
dictThe3rd=collections.defaultdict(set)
for key, val in categories.iteritems():
    for k, v in items.iteritems():
        if key == v:
            dictThe3rd[val].add(k)
print dictThe3rd

利回り

{'Tickets': set(['Ticket for Mettalica concert', 'Ticket for Placebo concert',
    'Ticket for Iron Maiden concert']),
'Jewelry': set(['Golden ring']),
'Antics': set(['Picture', 'Clock']),
'Moviez': set(['Batman', 'Spider-Man', 'The pianist']),
'Bookz': set(['Thinking in Java', 'Thinking in C++']),
'Gamez': set(['Diablo 3', 'Diablo 2', 'WoW', 'Cabal']),
'Clothes': set(['Asus', 'HP'])}
于 2012-08-21T12:01:40.073 に答える
1

Stefanソリューションと同じように使用する必要がありますitems()が、作成リストを印刷したり追加したりする代わりに、新しい辞書を作成する場合は、次のようにします。

dictThe3rd = {}
for key, val in categories.items():
    for k, v in items.items():
        if key == v :
            #print(val, k)
            try:
                dictThe3rd[val].append(k)
            except KeyError:
                dictThe3rd[val] = [k]

print(dictThe3rd)
于 2012-08-21T12:07:20.173 に答える