2014-10-13 48 views
2

關於以下內容的最佳方法是什麼?Python:以嵌套列表作爲輸入?

我想讓用戶輸入一個嵌套列表如下:

grid = input('Enter grid') 

用戶將被輸入的網格像這樣:

[['', 'X', 'O'], ['X', 'O', ''], ['X', '', 'X']] 

問題是我通過這個輸入到期望輸入爲嵌套列表的函數。 當得到輸入網格將是一個字符串,將不會與我的功能。同樣,如果我使用list()將網格轉換爲列表,它會生成包含網格的每個章程的列表,例如[,[,','

什麼是在上面的表單中接受輸入並將其轉換爲嵌套列表以傳遞給函數的好方法?我想要輸入值嵌套列表,就好像它是由程序本身設置的。

感謝

+2

我認爲你正在尋找['ast.literal_eval'](https://docs.python.org/3.4/library/ast.html#ast.literal_eval) – inspectorG4dget

+1

這對用戶來說不是更容易嗎?在「XO」,「XO」,「X X」等單獨的輸入中輸入行?然後,您可以創建每個字符串的'list(s)'並將其附加到行列表中。 – pepr

回答

1

由於inspectorG4dget評論,請使用ast.literal_eval

>>> import ast 
>>> ast.literal_eval("[['', 'X', 'O'], ['X', 'O', ''], ['X', '', 'X']]") 
[['', 'X', 'O'], ['X', 'O', ''], ['X', '', 'X']] 

要過濾掉無效的輸入,趕上SyntaxError

>>> ast.literal_eval("[['', 'X', 'O'], ['X', 'O', ''], ['X', ', 'X']]") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python3.4/ast.py", line 46, in literal_eval 
    node_or_string = parse(node_or_string, mode='eval') 
    File "/usr/lib/python3.4/ast.py", line 35, in parse 
    return compile(source, filename, mode, PyCF_ONLY_AST) 
    File "<unknown>", line 1 
    [['', 'X', 'O'], ['X', 'O', ''], ['X', ', 'X']] 
              ^
SyntaxError: invalid syntax 
+1

謝謝你建議'ast.literal_eval'而不是'evil.eval'。儘管引用有所改變,但也可以將其解析爲json。 – sberry

0

其實,恕我直言,你可以簡單地使用json.loads,並告訴用戶提供一個json,你的程序將會更加穩定/可用(即用戶不需要事先知道蟒蛇,但簡單的JSON這是一個標準格式)。

與問題列表對應的json基本上與您提供的幾乎相同(引號應該是雙引號,而None應該爲null)。

import json 
json.loads('[["", "X", "O"], ["X", "O", ""], ["X", "", "X"]]') 
# [[u'', u'X', u'O'], [u'X', u'O', u''], [u'X', u'', u'X']] 

json.loads('[[null, 1, ""], [null, null, 0]]') 
# [[None, 1, u''], [None, None, 0]] 

如果你知道你沒有瘋狂的值(與'內鍵(如「德州撲克」)或鍵包含None(如「達能」))那麼你可以做基本的預處理處理前手的鍵(如果你不希望強制簡單的報價)

例如:

def parse_input_to_list(input): 
    input = input.replace("'", '"').replace('None', 'null') 
    return json.loads(input) 


parse_input_to_list("[['', 'X', 'O'], ['X', 'O', ''], ['X', '', 'X']]") 
# [[u'', u'X', u'O'], [u'X', u'O', u''], [u'X', u'', u'X']] << the input you provided 

parse_input_to_list("[['null', 1, ''], [None, None, 0]]") 
# [[u'null', 1, u''], [None, None, 0]] 
parse_input_to_list('[[null, 1, ""], [null, null, 0]]') 
# [[None, 1, u''], [None, None, 0]] 

如果輸入提供是另一個程序的輸出,然後是json.dumps用於數據交換的其他程序的輸出(這正是Json所做的)。你完成了。

如果絕對沒有使用Json的方法,那麼你可以使用@alsetru的ast解決方案,它的工作正常。