当列表在字典中时,查找列表的元素?

问题描述:

这是作业,所以我不期待答案,只是一个正确的方向。当列表在字典中时,查找列表的元素?

在蟒我有一个字典,是像这样:

{'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.

+0

非常感谢您的帮助,非常简单而优雅的解决方案! – Sean 2011-04-03 13:17:45

使用列表理解可能不是最明显的方法,因为您没有构建列表,而是搜索一个单一的项目。您的代码没有返回密钥,但是如果找到密钥,则为大小为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)