2016-04-27 38 views
0

我從一個txt文件中讀取(在格式化酷似下文)的Python:從兩個單獨的行讀取,創建兩個列表

(+1 +2 +3 +4)

(-4 -9)( - 3 -6 -7)

我的期望的輸出是具有兩個(整數)列出

兩個前\ n和AFTER。

例子:

BEFORE_LIST = [1,2,3,4] 

AFTER_LIST = [[-4,-9] , [-3, -6, -7]] 

我想不通分裂和條的正確組合,以實現這一目標。

任何幫助,我非常感謝。

+0

您的文件是否可以包含嵌套列表? – user312016

+0

我很抱歉,但我是初學者與python,我不熟悉嵌套列表。但沒有規定說它不能使用。請解釋你是否有時間。 – Qbert

+0

是「+1 +2 +3 + 4」有效輸入嗎?如果是,預期輸出是什麼? – niemmi

回答

1

它會嗎?

import re 
from ast import literal_eval 
with open('test','r') as f: 
    for line in f: 
     line = line.replace(' ',',').replace('+','') 
     my_list = re.findall(r'\(.+?\)',line) 
     result = [list(literal_eval(i)) for i in my_list] 
     if len(result)==1: 
      result = [i for term in result for i in term ] 

     print result 

輸出:

[1, 2, 3, 4] 
[[-4, -9], [-3, -6, -7]] 
2
listOfValues = (x.split(' ')for x in (val.replace(')','') for val in input().split('('))) 
listOfIntegers = list(filter(None, [[int(value) for value in values if isInt(value)]for values in listOfValues])) 

print(listOfIntegers) 

的是isInt方法可以被定義爲:

def isInt(s): 
    try: 
     int(s) 
     return True 
    except: 
     return False 

或者避免該異常的更精細的解決方案:

def isInt(s): 
    return s.replace('+').replace('-').isdecimal() // doesn't cover all cases 

這不檢查無效的輸入格式(例如,不匹配的paranthesis)。

+0

而不是你自定義的'isInt'函數,簡單地使用'str.isdecimal()'怎麼辦? –

+0

@ByteCommander編輯。雖然isDecimal不會處理字符串中前面的+/-,所以我必須爲此特殊情況。我有點更喜歡我的IsInt方法,雖然它包含了開心路徑中的例外,這種情況讓我不敢去做。顯然,自定義isInt和isDecimal都可以通過使用一些正則表達式來避免。 – bashrc

+0

沒錯。您可以將舊版本作爲備選,只需在答案中顯示它們。我的評論只是一個建議,try-catch方法也沒問題。但是如果你可以用我們不需要使用水平滾動條的方式來格式化你的代碼,那就太好了......謝謝。 –