2011-04-03 124 views
5

這是作業,所以我不期待答案,只是一個正確的方向。當列表在字典中時,查找列表的元素?

在蟒我有一個字典,是像這樣:

{'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中的內建函數,非常感謝任何幫助!

回答

2

既然你要求提示,我不會發布工作代碼。

你的代碼是一個列表理解,所以它輸出一個列表。如果沒有結果,則列表將爲空。您可以將列表綁定到一個變量,使用len()檢查其長度,並返回None,如果它是0.

+0

非常感謝您的幫助,非常簡單而優雅的解決方案! – Sean 2011-04-03 13:17:45

2

使用列表理解可能不是最明顯的方法,因爲您沒有構建列表,而是搜索一個單一的項目。您的代碼沒有返回密鑰,但是如果找到密鑰,則爲大小爲1的列表,如果不存在,則爲大小爲0的列表。

使用這種方法的一種方法是訪問列表理解的第一個元素([0])。如果列表爲空,則會得到一個IndexError。如果提出IndexError,則將列表理解圍繞try/except並返回None

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

研究此代碼中的循環如何遍歷數據。您需要做類似的工作才能在原始字典中找到所需的數據。

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) 
相關問題