[英]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.