2013-11-27 43 views
0

我有一個控制檯應用程序,提示用戶輸入各種輸入。工作正常。是否可以格式化文本輸入以便Python將它識別爲列表?

現在我想添加一些額外的參數給被調用的函數,以允許用戶過濾結果。特別是,我希望用戶能夠輸入日期範圍,以返回在該時間段內創建的所有記錄。

我可以爲函數添加兩個單獨的參數,例如lowerDateLimit和upperDateLimit。但接受一對值作爲元組似乎更加貼切:dateLimits,它的形式如下:(lowerDateLimit,upperDateLimit)。

是否有任何方式讓用戶在控制檯中輸入文本以便能夠格式化其輸入,以便Python將它識別爲列表或元組?

或者Pythonic會做的更多事情是僅僅使用兩個單獨的參數作爲日期上限和下限?

+1

如果你正在使用'輸入'確定他們只需輸入逗號分隔值......如果您使用'raw_input',您將始終得到一個字符串... –

+0

您想要的日期格式是什麼? 「(2013,6,7)」是否會起作用,還是您需要解析像「2013年2月13日」這樣的數字格式? – DSM

+1

只是一個提示:一個普通的解析庫(例如'ast.literal_eval')可能會起作用,但可能太難處理,無法成爲一個很好的實際選擇。我建議選擇一種輸入格式並構建一個解析器,就像@ inspectorG4dget所做的那樣。 – Veedrac

回答

2
>>> ast.literal_eval(raw_input('Foo: ')) 
Foo: 1,2,3 
(1, 2, 3) 
+0

ast.literal_eval()和eval()之間的區別是什麼? ast.literal_eval()是eval()的更安全版本嗎? –

+1

@SimonTewsi:不僅如此,它只會*允許看起來像Python文字的輸入。 –

+0

在玩了一段時間之後,我決定以此作爲解決方案。其他人打算使用ast.literal_eval(raw_input()):我發現如果我作爲用戶嘗試輸入直接文本而不是用逗號分隔的列表,則必須在使用引號括起文本時ast.literal_eval。所以我添加了一個分支:對於希望用戶輸入的列表使用ast.literal_eval(raw_input()),否則只需使用raw_input(),這樣用戶就不需要用引號括起它們的條目。 –

2
In [84]: nums = [int(i) for i in raw_input("Enter space separated integers: ").split()] 
Enter space separated integers: 1 5 6 7 3 56 2 3 4 2 1 

In [85]: nums 
Out[85]: [1, 5, 6, 7, 3, 56, 2, 3, 4, 2, 1] 
1

我不能發表評論,但你是否需要一個列表,而不是一個元組,ast.literal_eval可以處理由包括括號:

In [1]: import ast 

In [2]: ast.literal_eval('[1,2,3]') 
Out[2]: [1, 2, 3] 
相關問題