質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

7623閲覧

python,listで数字の順番を逆にしたいです。

nnakusokuza

総合スコア7

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/11/19 16:50

###前提・実現したいこと
こんにちは。
プログラミング(python)を始めたばかりの初心者です。
今pythonの教科書の問題を解いていてつまってしまい、色々と分からなくなってどこをどうしたら良いのか全然分からないという状況です。(笑)
(こういうサイトに質問をするのが初めてで色々と間違っていたらすみません。)

問題↓
def reverse(list):
for i in range(len(list) // 2):
???????????????? = ?????????????????
return list
上のコードを参考に実行結果を作りたいのですがなかなか上手くいかないです。

実行結果↓

   

データを入力してください:1 2 3 4 5 6 7 8 9 10
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

###発生している問題・エラーメッセージ

str = eval(input(データを入力してください:)) ^ SyntaxError: invalid syntax

###該当のソースコード

python

1 2def reverse(list): 3 4 list = [] 5 str = eval(input(データを入力してください:)) 6 num = str.split() 7 8 for i in range(len(list)//2): 9 temp = list[i] 10 list[i] = list[-i] 11 list[-i] = temp 12 13 return list 14 15

###試したこと
まだ始めたばかりで色々と頑張って考えてみたのですが、まだプログラミングに慣れていなくて試すも何も分からないです(笑)

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

evalの引数は適切な文字列でないといけないからです。
入力を無理矢理実行しようとしてしまっているので、文法エラーが出ています。

**基本的に、evalとexecは使用禁止です。**初心者のうちはなおさらです。
普通にinputで値を受け取ればよいです。

Python

1>>> input_list = input().split() 22 4 5 6 3 3>>> print(input_list) 4['2', '4', '5', '6', '3'] 5>>> 6>>> input_list = list(map(int, input_list)) 7>>> print(input_list) 8[2, 4, 5, 6, 3]

なお、今回のエラー(Syntax Error)は値の受け取り方に全て起因しています。
かなり泥臭い方法ではありますが、反転の処理自体には問題ないように思えます。

もうちょっときれいに解くなら

リストのように、値が並んでいるものをシーケンスと呼びます。
シーケンスを反転させる方法はいくつかありますが、今回の場合スライスを使うと良いでしょう。

こんな感じです。

Python

1hoge = 'abcde' 2print(hoge[::-1]) 3 4"""出力 5edcba 6"""

スライスは見慣れるまでは難解に思えますが、慣れると非常に簡潔です。
覚えておくと、かなり融通が効きます。Pythonのスライスについて

その他、気になったところ

Python

def reverse(list):
list = []
...

せっかく引数としてlistを受け取ったのに、空のリストで上書きしてしまっています。
引数は既にデータがあるものとして扱ってください。

つまり、入力を受け付けるべきは関数reverse内ではないと言うことです。


Python

def reverse(list):
for i in range(len(list) // 2):
???????????????? = ?????????????????
return list

これ、教科書に載っていたんでしょうか?それでしたら、ちょっと内容が眉唾です。
元々の関数/クラスを隠してしまう(シャドウイング)ので、次の変数名は避けてください。
str list dict set max min int float sum などなど。

質問のしかた

teratailでは、上記のようにコードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
特にPythonの場合、インデントが崩れるとコードの意味が変わってしまいます。

投稿2017/11/19 17:00

編集2017/11/19 17:36
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nnakusokuza

2017/11/19 22:33

皆さん本当にありがとうございます! おかげ様で何とか作ることが出来ました。 どれもとても良かったのですが、質問のしかたまで教えてくださったLouiS0616さんをベストアンサーにさせていただきます! pythonの勉強がんばります!
guest

0

python

1list = [1,2,3,4,5] 2list.reverse() 3for v in list: 4 print v,

reverse」を使うと一行です。

(これは、ご質問のサンプルコードで定義したものではなく、組み込み型のメソッドです。
そして、本来なら例題の方が、同名のメソッド名を避けるべきです)

でも一方で、何行になっても、泥くさくてもいいから、
最初は自力で書いて欲しいところです。
「ライブラリないと書けない」になってしまうからです。
配列やFor文の仕組みをよく理解すると、書けると思います。

投稿2017/11/19 17:08

編集2017/11/19 17:14
LLman

総合スコア5592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

python

1int_list = [1, 2, 3, 4, 5, 6, 7] 2print(int_list[::-1])

[::-1]としてやれば簡単に逆順にする事が出来ます

投稿2017/11/19 16:57

編集2017/11/19 21:40
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2017/11/19 17:06

intという変数名を使うのはよくないですね。組み込み型をシャドウイングしています。 こんな感じの発見しづらいエラーを誘発しますよ。 >>> int(3.4) 3 >>> int = 4 >>> int(3.4) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'int' object is not callable
退会済みユーザー

退会済みユーザー

2017/11/19 21:39

コメントありがとうございます 完全に抜けていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問