2013-07-17 80 views
0
開頭

我們不能檢查一個值是否以字符串開始?python檢查值是否以

我有一個包含字典:

my_dict = {'category': 'failure', 'logged_product': 'log_prd1', 'product': 'prd1', 'backlog_month_done': None,'TDC': <__main__.TDC object at 0x010F47D0>} 

for attr, value in my_dict.items() : 
    if value.startswith('<__main') : 
    #removeit 

爲什麼它與關鍵,而不是與價值的工作?我該怎麼做 ? 任何幫助,將不勝感激

我收到錯誤:

AttributeError: 'NoneType' object has no attribute 'startswith' 
+0

'my_dict'的內容是什麼? –

+4

'value'必須是一個字符串或其他具有'startswith'方法的對象。請檢查您的值的類型。 – kwatford

+0

也許,如果這正是您正在運行的內容,因爲已經鍵入了'<__ main'',並且'value'與您的'if'子句不在同一個範圍內。 – Rubens

回答

6

startswith method is available for string objects,所以它看起來像attr是一個字符串,但value不是。

從您的編輯中,它看起來像你的其中一個值是None。要解決,你應該在你my_dict更改此:

'backlog_month_done': None 

這樣:

'backlog_month_done': '' 

您還可以檢查是否value是一個字符串類型:

for attr, value in my_dict.items() : 
    if not isinstance(value, basestring): 
     continue 
    if value.startswith('<__main') : 
    #removeit 
+0

有沒有辦法動態地做到這一點?我應該遍歷'my_dict'並測試'value == None'? – salamey

+0

如果你想跳過'None'值(或者一般的非字符串類型),那麼是的,你可以檢查。我將在一個示例中進行編輯。 – jh314

0

發生的原因問題my_dict['backlog_month_done']None

您可以在您如果使用額外的條件解決:

my_dict = {'category': 'failure', 'logged_product': 'log_prd1', 'product': 'prd1', 'backlog_month_done': None,'TDC': <__main__.TDC object at 0x010F47D0>} 

for attr, value in my_dict.items() : 
    if value and value.startswith('<__main'): 
     #removeit 

不過,我懷疑這會做你所期望的,作爲在my_dictTDC值不是一個字符串:它是一個實例你已經拷貝和粘貼類的repr,所以你可能會得到這樣的

AttributeError: 'TDC' object has no attribute 'startswith' 

消息您可以檢查防止通過檢查valuestr

for attr, value in my_dict.items() : 
    if isinstance(value, str) and value.startswith('<__main'): 
     #removeit 

但是,我懷疑這不是你想要的。如果你想檢查一個值是TDC的一個實例,你需要通過TDC作爲參數傳遞給isinstance

for attr, value in my_dict.items() : 
    if isinstance(value, TDC): 
     #removeit 

或者,如果你確定要刪除任何(甚至再版)以「<__main」開頭,你需要確保你得到了一個項目的字符串。在這種情況下,您可能需要使用repr函數,因爲str經常被重載以返回自定義值。

​​
+1

問題是'TDC'只是一個例子,而且我的字典包含了很多以'<__ main'開頭的值,所以我想動態地執行它.... – salamey

+0

@ user1734229在這種情況下,您需要轉向他們成字符串。將在上面編輯。 – RoadieRich

+0

@ user1734229已編輯,但你真的想考慮這是否是正確的方式來做你想做的事情。在實際代碼中使用'repr'通常被認爲是「代碼味道」。看看還有哪些規則定義了你想刪除的值。 – RoadieRich

1

if value.startswith('<__main') :

此代碼可能旨在發現<__main__.TDC object at 0x010F47D0>但它不工作,因爲你的dict包含None值,您看到的<__main__.TDC object at 0x010F47D0>僅僅是對象的文本repr esentation,但它不是一個字符串。

如果您確定您確實需要這樣的異構dict,那麼您應該根據從isinstance(或type)得到的內容進行過濾。

for attr, value in my_dict.items() : 
    if not isinstance(value, basestring) : 
     continue # if you really want to remove it, use del my_dict[attr] here instead