簡體   English   中英

Python雙列表理解

[英]Python double list comprehension

我有一個從文件中讀取的字符串列表,我需要將其轉換為二維數組:

IN >> lines = ['0.1;0;0;0;', '0.2;0;0;0;', '0.3;1;1;1;', '0.4;2;2;2;', '0.5;0;0;0;']
# Goes on for a few thousand lines

注意每個字符串都以;結尾; .

我需要排除全為零的行(有些行在開頭和結尾都是零)

.split(); filter None以刪除我將從.split()返回的每個數組末尾獲得的空值。

data_array = [list(filter(None, line.split(';'))) for line in lines if line.split(';')[1] != '0']

OUT >> data_array = [[0.1, 0, 0, 0], [0.2, 0, 0, 0], [0.3, 1, 1, 1], [0.4, 2, 2, 2], [0.5, 0, 0, 0]]

這有點返回我需要的二維數組,但包括全為零的數組,所以我的條件必須在錯誤的地方。 除了我認為列表理解末尾的條件會過濾進入列表的元素。

然后我想我需要過濾“內部”數組:

data_array = [[l for l in (filter(None, line.split(';'))) if l != '0'] for line in lines]

OUT >> data_array = [[0.1], [0.2], [0.3, 1, 1, 1], [0.4, 2, 2, 2], [0.5]]

除了這是刪除零但留下標記(每個數組的第一個元素是一個標記)

我想要得到的只是包含數字但不包含零的數組

DESIRED OUTPUT >> data_array = [[0.3, 1, 1, 1], [0.4, 2, 2, 2]]

在多行上執行此操作而不使用filter(None, ...)更干凈,因為您可以只使用line[:-1]來發出最后一個字符。 首先在列表中創建列表,可以通過以下方式完成:

nested_list = [line[:-1].split(';') for line in lines] 

然后,您可以遍歷內部列表以檢查它們是否包含 0:

filtered_list = [line for line in nested_list if '0' not in line]

然后我們需要將所有內容轉換為浮點數:

result = [list(map(float, line)) for line in filtered_list]

或者,如果你真的想要一個單線:

result = [list(map(float, line)) for line in [line[:-1].split(';') for line in lines] if '0' not in line]
[ x
  for x in ([ float(v) for v in line.split(';') if v ]
            for line in lines)
  if any(x[1:]) ]

我們有一個內部生成器,它迭代所有行,拆分每一行,刪除空字符串並將所有剩余值轉換為浮點數。 然后我們有一個外循環,它通過對除第一個元素之外的所有元素使用any()函數來檢查這些結果中的每一個是否只包含零。

這將產生所有浮點數。 如果您只需要每行中的第一個元素是一個浮點數,其余的應該是整數,那么使用這個擴展:

[ x
  for x in ([ (int if i else float)(v)
              for i, v in enumerate(line.split(';'))
              if v ]
            for line in lines)
  if any(x[1:]) ]

暫無
暫無

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

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