簡體   English   中英

刪除空的嵌套列表-Python

[英]Remove empty nested lists - Python

我正在將.csv文件讀取到列表中,並在其中添加了一個空列表,我正在使用下面的代碼來執行此操作。

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]

它確實刪除了空的嵌套列表,但是將包含數據的所有其他嵌套列表設置為None[None, None] 我修改為:

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

這會徹底清除所有嵌套列表。

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

我想你想做的是

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

這使得tscores中只列出了空列表

替代user2990008的答案 ,您不能首先創建空列表:

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

僅出於完整性考慮:在這種情況下,我認為列表理解不是最簡單的解決方案。 在這里,函數式編程很有意義,恕我直言。

要“自動”遍歷列表並過濾特定元素,可以使用內置函數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]]

每個元素x列表的a被傳遞給lambda功能和返回的列表僅包含的元素a當且僅當條件len(x) > 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)]

...請記住,列表理解可以處理可選的條件子句以進行過濾。 僅當您可以確保要遍歷的列表的每個元素都支持len()函數(這當然可以通過使用更復雜的條件,例如hasattr(r,' len ')和LEN(r)的

注意:這僅測試一個深度級別...它不是遞歸的。

tscores = [x for x in tscores if x]

如果列表為空,則條件tscores將返回false,因此不會包含在tscores

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM