2013-12-22 110 views
1

我有excel在第一行有列名。我需要不None來閱讀:需要從列表中刪除無

a = [Sheet.UsedRange.Rows(1).Value] 
[((u'Step', u'Test Case ID', u'Traceability Ref', u'Test Description', u'Display', u'Test conditions', None, None, None, None, None, u'Test Criteria', u'Delay Time(ms)', u'Capture Time(ms)', u'Automation Type(A/S)', u'Expected Output', None, None, None, u'Actual Output', u'Comments'),)] 

我厭倦了使用過濾器:

a = filter(None, a) 

我需要刪除None(這是我在Excel中的空列)。

+1

'過濾器(無,一) '實際上非常接近。不過,它會刪除空字符串,零和其他虛假值。你在Python 2或3嗎? – user2357112

+0

您嘗試使用'filter' ...發生了什麼?它工作? – shx2

回答

10

解決方案的問題在於您的列表本身。如果你仔細觀察,它不是一個你可以過濾的值列表,而是一個列表,帶有單個元組的單個元素是另一個元組,然後包含所有的值。

因此,如果您修復列表a,那麼它會工作

a = [Sheet.UsedRange.Rows(1).Value] 
a = list(filter(None, a[0][0])) 

或簡稱:

a = list(filter(None, Sheet.UsedRange.Rows(1).Value[0])) 
+2

或者也許只是'a = list(filter(None,Sheet.UsedRange.Rows(1).Value [0]))'以減少垃圾;最外層的包裝來自''''結構。 – zwol

+0

在一般情況下,您很少想使用過濾器(無,...),因爲它會過濾出「False」的元素,如「None」,「0」,「[]」,「'」。如果col_name不是None,列表解析'[col_name for Sheet_UsedRange.Rows(1).Value [0]中的col_name]可能是另一種選擇。 – alko

+0

a = list(filter(lambda x:x不是None,Sheet.UsedRange.Rows(1).Value [0])) – umeboshi

2

試試這個:

while None in a: 
    a.remove(None) 
+1

你試過這個嗎? –

+0

這是**慢得多**相當於'filter(lambda x:x不是None,a)',這是OP已經嘗試使用的。 – alko

+0

公平地說,我確實嘗試過......在使用SL4A的手機上。我有點4G,所以我無法查找過濾器文檔(我很少使用它)。 – Logan