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

时间:2011-04-03 12:49:32

标签: python dictionary

这是作业,所以我不指望答案,只是朝着正确的方向发展。

在python中我有一个类似的字典:

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

例如'Racing Bike'是产品名称,对的列表分别是(部分,金额)。

我必须编写一个函数,如果上面的字典和作为参数的产品名称将返回它的密钥,如果产品名称不存在则返回'None'。

我用过:

    return [key for key, value in product_dict.iteritems() if list(value)[0] == string]

这在测试时返回了正确的密钥但我不知道如果产品名称不存在则如何使其返回'none'并且我不确定这是否是最好的方法。'< / p>

我只能在python中使用内置函数,非常感谢任何帮助!

4 个答案:

答案 0 :(得分:2)

由于您要求提示,我不会发布工作代码。

您的代码是列表解析,因此它会输出一个列表。如果没有结果,列表将为空。您可以将列表绑定到变量,使用len()检查其长度,如果为0则返回None

答案 1 :(得分:2)

使用列表推导可能不是最明显的方法,因为您没有构建列表而是搜索单个项目。您的代码不返回密钥,但是如果找到密钥则返回大小为1的列表,如果不存在,则返回大小为0的列表。

使用此功能的一种方法是访问列表推导的第一个元素([0])。然后,如果列表为空,您将获得IndexError。使用try/except围绕列表理解,如果None被提升则返回IndexError

答案 2 :(得分:1)

列表理解用于构建列表;你真正想要的是找到数据。这会立即建议一个字典,但在这种情况下,最简单的方法是使用循环来简单地遍历数据,并尝试匹配产品名称。

如果你需要经常进行这些类型的查找(我知道这是作业,但让我们假装你是为了工作而写这个),那么最好是制作一个新的字典。直接键入产品名称。我将向您展示该解决方案,这可能不是您的作业所需的解决方案,但也许您可以弄清楚如何使用循环使其适应更简单的解决方案:

# 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)])]

研究此代码中的循环如何遍历数据。您需要做类似的事情才能在原始字典中找到所需的数据。

答案 3 :(得分:0)

在一行中:

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)