2016-04-11 3 views
0

私はPythonで "ユーザー入力リスト"を使う方法を知りたいのですが、我々は次の操作を行い、文字列の場合は例えば非対話型環境**非対話環境でコードを書くときにPythonで 'User entered list'を使うにはどうすればいいですか?**

...: - ?。

str1=input("Enter the string1: ") 

を同様にコードを書いている間、我々は次の行を入力整数の

num1=int(input("Enter the number1:")) 

同様に、複素数の場合、コードを書くときに次の行をタイプします。

c1=complex(input("Enter complex number1: ")) 

タプルだけでなく辞書にもお答えください。構文は何ですか?

+0

を持ちたい場合'、'やその他の区切り文字で区切られた項目を入力し、 'split'を一つのオプションとして使うことができます。あなたはタプルに対して同じことをすることができますが、単に 'タプル'の中に 'split'を入れます。あなたはintsの文字列などにしたい場合は、コースの種類を処理する必要があります – Pythonista

+0

誰か必然的に 'eval'を提案するつもりです。これは悪い考えです。ユーザーが何か悪意のある操作をしたときに、ユーザーが何か間違ったことをした場合には厄介な結果をもたらし、Python構文に直接マップしない入力を解析する重要な作業を回避します。 – user2357112

+0

'ast.literal_eval' – kindall

答えて

0

あなたが安全にast.literal_evalを使用することができますが、ユーザからのリテラルの任意のpythonを評価:

import ast 

data = ast.literal_eval(input("enter a python literal:")) 
print(type(data),data) 

これはあなたがあらゆる種類のものを入力することができます:

enter a python literal:[1,2,3] 
<class 'list'> [1, 2, 3] 
enter a python literal:(3,2,1) 
<class 'tuple'> (3, 2, 1) 
enter a python literal:"hello" 
<class 'str'> hello 
enter a python literal:3.4 
<class 'float'> 3.4 

#this one is *extremely* malicious when put in eval() 
enter a python literal:open(__file__,"w").close() 
Traceback (most recent call last): 
    ... 
ValueError: malformed node or string: <_ast.Name object at 0x1056b4f98> 

# but ast.literal_eval is safe with user input like this. 

あなたがかもしれないとしてもちょうどもののsplitリストを取得するには、コンマでデータを入力してください。

data = input("enter some values seperated by ,s: ").split(",") 

これはあなたのリストが表示されます:

enter some values seperated by ,s: 1,2,3 
<class 'list'> ['1', '2', '3'] 
0

はリストに入っユーザーとしてこれを考えてはいけません。ユーザーがリストを入力すると、上司が手作業でニューロンを発射したようなものです。リストは、ユーザが対処してはならないプログラム内部データ構造である。

ユーザー入力の形式を定義し、それを解析するための適切な形式依存コードを記述します。あなたはコンマと(オプション)空白で区切って入力ベース-10整数のために、ユーザーが必要な場合たとえば、あなたが本当にあなたの入力フォーマットは、Pythonリテラル構文になりたい場合は、

ints = [int(s) for s in input().split(',')] 

を使用することができ、あなたが使用することができますast.literal_eval

obj = ast.literal_eval(input()) 

そして、あなたは手動であなたのニューロンの発火上司の考えと間違って何も見えない場合は、あなたがevalでユーザーの入力任意のPythonの式(いない文)を持つことができます。

# Bad idea - this makes a mess if the user does something wrong and is potentially 
# catastrophic if the user does something malicious. 
# For example, if the user types __import__('os').system('nasty command'), 
# they can delete all your files or steal your browser's saved passwords. 
terrible_idea = eval(input()) 
+0

'open(__ file __、" w ")。close()'は有効なpython式です。 'eval'を付けると内容が削除されます。現在実行中のファイル。しかしそれは有効ではありません_ので、まだ安全です。 –

+0

誰もが言っていたように、evalとユーザ入力で起こりうる問題については、明るいテキストで大きな免責を言わずに、プログラミング/ Pythonの初心者に 'eval()'のヒントを与えないでください!意味evalが悪である理由を説明し、なぜあなたがそれに頼る必要があるか分からない限り、それを行うことは非常に愚かなことです。私たちは、初心者が質問しているので、次の世代の愚かな質問に対処する必要がないので、世界がここに来るのを助けています。前もって感謝します。 – Torxed

+0

私はすでにそれが悪い考えであることを明確にしました。なぜそれが悪い考えであるのか、強調するために大胆なテキストについて、より精緻に答えが更新されました。 – user2357112

0

ユーザが入力のみstrは、これはほとんど決して良いアイデアではありません。これはinput()strを返すことを意味します。 listが必要な場合は、listにする必要があります。同じことが他のすべてに当てはまります。

x = input("a, b, c: ") 
# a, b, c: 2,3,4 => x -> "a,b,c" str 
l = [int(i.strip()) for i in x.split(",")] # [2, 3, 4] 

ユーザーが「リスト」を入力したい場合は、むしろちょうど持っている彼らに、あなたは何をしたいの入力repr()、(良く、このようをしない)

x = eval(input("a, b, c: ")) 
# a, b, c: 2,3,4 => x -> (2, 3, 4) tuple 
+0

evalを使用すると、 'open(__ file __、" w ")。close()'とタイプすることができ、ユーザーは文字通り.pyファイルの内容を削除します。 –

+0

@ TadhgMcDonald-Jensen合意。ちょうどそれが動作することを示す。私は、与えられた文脈の中のどんな形でも 'eval()'を使用することはありません。 –

+1

なぜ、 '' ast.literal_eval'](https://docs.python.org/3.5/library/ast.html#ast.literal_eval)は、Python _literals_のみを解析するのでジェネリック表現ではないと示唆していませんか? –

関連する問題