2015-12-12 40 views
2

我試圖使用input來獲取元組的值。但是,由於input將該值設置爲字符串,因此我正在嘗試unstring。我發現eval適用於此目的,但它應該是distrusted.雖然這不會成爲問題,只要我私下使用該代碼,如果我公開發布它,我想使用盡可能最好的代碼。如何解開沒有eval的列表/元組

那麼,有沒有另一種方法在Python 3中解開tuple

這裏是目前我在做什麼:

>>> a = input("What is the value? ") 
What is the value? (3,4) 
>>> a 
'(3,4)' 
>>> eval(a) 
(3, 4) 
+0

你可以嘗試讓兩個值(我假設你想有一個元組,而不是N元)這樣的'A,B =地圖(INT,輸入()分裂() )'其中'a'和'b'由空格分開。 – jermenkoo

+0

爲什麼不讓用戶輸入更簡單的東西,比如沒有括號的'3,4'? – 101

+0

@ 101,因爲此代碼將用於笛卡爾座標(其中很多)。我發現將座標組合在一起更容易。 :) –

回答

4

使用安全版本的EVAL,ast.literal_eval其設計正是爲您所要實現的目標:

from ast import literal_eval 
tup = literal_eval(a) 
2

我會做這樣的:

>>> inp = input() 
'(3,4)' 
>>> tuple(map(int, inp.strip()[1:-1].split(','))) 
(3, 4) 

其中strip將確保開頭或結尾的空白將不會毀掉你的一天。

+0

非常感謝!我繼續接受@Padraic Cunningham的答案,因爲它更簡單,並且也與列表一起工作(我需要),但我會爲未來的代碼記住您的答案。 –

1

簡單,你不要求用戶輸入一個元組。相反,你這樣做:

x = input("Enter x value: ") 
y = input("Enter y value: ") 

data = (
    int(x), 
    int(y) 
) 

print( 
    repr(data) 
) 

--output:-- 
(10, 3) 
+0

這對於我的代碼來說不會有效 - 它基於歐幾里德幾何,並且有很多笛卡爾座標,我發現它們更容易組合在一起。不管怎麼說,還是要謝謝你! –