当列表在字典中时,查找列表的元素?
这是作业,所以我不期待答案,只是一个正确的方向。当列表在字典中时,查找列表的元素?
在蟒我有一个字典,是像这样:
{'bike101': ('Road Bike',
[('WH139', 2),
('TR102', 2),
('TU177', 2),
('FR101', 1),
('FB101', 1),
('BB101', 1),
('GS101', 1)]),
'bike201': ('Mountain Bike',
[('WH239', 2),
('TR202', 2),
('TU277', 2),
('FR201', 1),
('FB201', 1),
('BB201', 1),
('GS201', 1)]),
'bike301': ('Racing Bike',
[('WH339', 2),
('TR302', 2),
('TU377', 2),
('FR301', 1),
('FB301', 1),
('BB301', 1),
('GS301', 1)])}
例如“公路车”是产品名称和对所述列表是(部分,所需的量)表示。
我必须写一个函数,如果上面的字典和产品名称作为参数,然后将返回键并返回'无',如果产品名称不存在。
我用:
return [key for key, value in product_dict.iteritems() if list(value)[0] == string]
而且测试时这个返回正确的钥匙,但我不知道该怎么做,如果产品名称不存在,它返回“无”,我不知道这是做到这一点的最佳方式。“
我只能使用python中的内建函数,非常感谢任何帮助!
既然你要求提示,我不会发布工作代码。
你的代码是一个列表理解,所以它输出一个列表。如果没有结果,则列表将为空。您可以将列表绑定到一个变量,使用len()
检查其长度,并返回None
,如果它是0.
使用列表理解可能不是最明显的方法,因为您没有构建列表,而是搜索一个单一的项目。您的代码没有返回密钥,但是如果找到密钥,则为大小为1的列表,如果不存在,则为大小为0的列表。
使用这种方法的一种方法是访问列表理解的第一个元素([0]
)。如果列表为空,则会得到一个IndexError
。如果提出IndexError
,则将列表理解围绕try/except
并返回None
。
列表理解是建立一个列表;你真正想要的是找到数据。这立即建议字典,但在这种情况下,最简单的方法是使用循环来简单地遍历数据,并尝试匹配产品名称。
如果你需要经常做这些查找(我知道这是作业,但假设你正在编写这个工作),那么最好是制作一个由产品键入的新字典直接命名。我会告诉你的解决方案,这很可能不是你的家庭作业所需要的解决方案,但也许你可以弄清楚如何使用循环使其适应简单的解决方案:
# Restructure the dictionary
def invert_dictionary(input):
out={}
for bike_number in input.keys():
product_name, list_of_parts = input[bike_number]
if not out.has_key(product_name):
out[product_name]=[]
out[product_name].append((bike_number, list_of_parts))
return out
new_dict = invert_dictionary(d)
# Returns a list of all bikes that are tagged "Racing Bike"
print new_dict['Racing Bike']
输出:
[('bike301', [('WH339', 2), ('TR302', 2), ('TU377', 2), ('FR301', 1), ('FB301', 1), ('BB301', 1), ('GS301', 1)])]
研究此代码中的循环如何遍历数据。您需要做类似的工作才能在原始字典中找到所需的数据。
在一个行:
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)
非常感谢您的帮助,非常简单而优雅的解决方案! – Sean 2011-04-03 13:17:45