How to create a dict from 2 dictionaries in Python?

Now I am dealing with Python dicts. I wrote the code:

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)

I wanted to create a third dict where I would like to:

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

etc.

How to do it? My code shows:

test.py, line 14, in <module>
    for key, val in categories :
TypeError: 'int' object is not iterable
+5
source share
3 answers

If you use dict as an iterator, it will only give its keys, not tuples of keys and values. You will need to use categories.items()(or categories.iteritems()if you are using Python 2.x) to get these tuples:

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

You can use dict expressions to get a dict with category names as keys and all elements in that category as values:

>>> 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']}

Explanation:

, cat. , dict .

+5

:

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'])}
+2

You should use it items()as in Stefan's solution, but if you want to create a new dictionary instead of printing, create a list or add it:

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)
+1
source

All Articles