В одну строку:
product_dict = {'bike301': ('Racing Bike', [('WH339', 2),('TR302', 2),
('TU377', 2),('FR301', 1),
('FB301', 1),('BB301', 1),
('GS301', 1)
]
),
'bike201': ('Mountain Bike', [('WH239', 2),('TR202', 2),
('TU277', 2),('FR201', 1),
('FB201', 1),('BB201', 1),
('GS201', 1)
]
),
'bike101': ('Road Bike', [('WH139', 2),('TR102', 2),
('TU177', 2),('FR101', 1),
('FB101', 1),('BB101', 1),
('GS101', 1)
]
)
}
print dict( (string,k) for k,(name,li) in product_dict.iteritems() if name==string).get(string,None)
Не вижу смысла размещать элементы вашего словаря в форме number:(name,a_list)
Я думаю, что лучше определить:
product_dict2 = {('bike301','Racing Bike'):[('WH339', 2),('TR302', 2),
('TU377', 2),('FR301', 1),
('FB301', 1),('BB301', 1),
('GS301', 1)
],
('bike201','Mountain Bike'):[('WH239', 2),('TR202', 2),
('TU277', 2),('FR201', 1),
('FB201', 1),('BB201', 1),
('GS201', 1)
],
('bike101','Road Bike'):[('WH139', 2),('TR102', 2),
('TU177', 2),('FR101', 1),
('FB101', 1),('BB101', 1),
('GS101', 1)
]
}
Тогда для ваших нужд вы должны написать:
print dict( (string,numb) for numb,name in product_dict2.iterkeys() if name==string).get(string,None)