2015-11-01 107 views
1

我在.csv文件中讀取一個列表並添加一個空列表,我使用下面的代碼來執行此操作。刪除空的嵌套列表 - Python

with open('Scores.csv', 'r') as scores: 
    reader = csv.reader(scores) 
    tscores = [[str(e) for e in r] for r in reader] 

它創建正確的嵌套列表清單,但每一行後追加一個空的列表讀取,像這樣:

[[score1, name1], [], [score2, name2], []] 

我相信它的閱讀\n爲空字符串這就是爲什麼我得到這一點,所以我嘗試使用刪除空列表:

tscores = [tscores.remove(x) for x in tscores if x] 

這確實刪除空巢名單,不過這臺包含數據所有其他嵌套列表210即[None, None]。我修改爲:

tscores = [tscores.remove(x) for x in tscores if []] 

它完全消除了所有嵌套列表。

如何在不附加空列表的情況下讀取具有相同輸出(嵌套列表的列表)的文件,或者如何在讀入後刪除所有空列表?

回答

1

我想你想要做的是

tscores = [x for x in tscores if x != []] 

,這使得僅包含非空列表中tscores

+0

Bah,它的工作原理!謝謝! – PairedPrototype

0

替代user2990008's answer列表,你不能在第一時間創建空列表:

tscores = [[str(e) for e in r] for r in reader if len(r) > 0] 
+0

這似乎也是一個很好的答案,也許是最合適的。編輯:這絕對有效。 – PairedPrototype

0

我不知道我在正確理解你的問題,但你可以刪除列表中的列表空項(或元組的列表或列表其他序列)使用這樣的事情:

#/bin/python 
# ... 
with open('Scores.csv', 'r') as scores: 
    reader = csv.reader(scores) 
    tscores = [[str(e) for e in r] for r in reader if len(r)] 

...記住你的列表理解可以處理可選的條件子句過濾。這隻有在確保列表中每個元素都支持函數的情況下才有效(當然,您可以通過使用更復雜的條件來確保這一點,例如:hasattr(r,'LEN「)和len(R)

注:這只是測試深度的水平......這是遞歸

0

只是爲了完整性:在這種情況下,我認爲名單內涵是不是最簡單的解決方案,這裏函數式編程會有意義,imho。

爲「自動」迭代一個列表,過濾特定的元素,你可以使用內置的功能filter

In [89]: a = [ [1, 2], [], [3, 4], [], [5, 6], [], [], [9, 5, 2, 5]] 

In [91]: filter(lambda x: len(x) > 0, a) 
Out[91]: [[1, 2], [3, 4], [5, 6], [9, 5, 2, 5]] 

列表a的每一個元素x傳遞給lambda功能和返回的列表只包含元素a當且僅當滿足條件len(x) > 0。因此返回一個沒有嵌套空列表的列表。

+0

嗯...'過濾器(lambda x:len(x)> 0,a)'在各方面都比'[x for x in a len(x)> 0]'糟糕 - 對於同樣的效果。 – Claudiu

+0

在Python中它應該比較慢,因爲函數調用效率低下,是的 - 通常取決於實現。然而,爲了過濾的目的,我(個人)喜歡這個,因爲它更直觀。這種情況就像'filter()'的最默認情況之一。無可否認,這是一個基於意見的決定,只是我的想法。 – daniel451

+0

是的,我傾向於做的是如果函數已經存在/被定義在其他地方,我使用'filter' /'map'(例如'map(str.strip ,而不是'[x for maybe_gorms,如果is_gormed(x)]'),但如果我需要的話,而不是'[x.strip()for strs]','filter(is_gormed,maybe_gorms)''一個表達式然後我使用列表解析。即使使用map/filter,人們也可能不同意 - 列表理解對眼睛來說更容易(可能是主觀的),並且更常用 – Claudiu