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

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

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

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

Q&A

解決済

2回答

412閲覧

for 構文の変数について基本的な質問

seta-nachan

総合スコア3

Python 3.x

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

0グッド

0クリップ

投稿2020/06/23 02:26

編集2020/06/23 02:50

言語はpython3です。
プログラミングの問題です。0以上、100以下の整数xに対してNN桁のヒント
> 30 
< 40
> 35
などが与えられ(上記は xは30より大きい、40より小さい、35より大きい)の意味となります)
xの範囲を狭めていくプログラムを書きたかったのですが
下記のプログラムにNNに 1
LLには > 30 を代入したところ
八桁めのfor k in list1:のk部分になぜかlist1の偶数しか入っていないようなのです。
自分の知識によるとlist1の中身が全て順番に入ると考えましたが、結果が異なっていて理由がわかりません。
ご存知の方がおりましたらご教授お願いします。

NN = int(input()) list1 = list(range(100)) for i in range(NN): LL = input().split() hugo = LL[0] kazu = int(LL[1]) if hugo =='>': for k in list1: if k <= kazu: list1.remove(k) print(list1)``

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

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

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

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

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

jeanbiego

2020/06/23 02:46

インデントがわからないと厳しいので、コードを書くときは<code>機能を使って下さい。
seta-nachan

2020/06/23 02:47

本当ですね。修正します
guest

回答2

0

面白そうだったので書いてみました。
参考にはあまりならないかもしれませんが、色んな方法があるのだと言うことで一つ。

Python

1import sys 2 3lst = [*range(100+1)] 4 5for s, n_s in map(str.split, sys.stdin): 6 n = int(n_s) 7 pred = { 8 '>': lambda e: e > n, 9 '<': lambda e: e < n, 10 }[s] 11 12 lst = [*filter(pred, lst)] 13 print(lst)

標準入力

> 30 < 40 > 35

実行結果 Wandbox

[31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] [31, 32, 33, 34, 35, 36, 37, 38, 39] [36, 37, 38, 39]

投稿2020/06/23 12:56

LouiS0616

総合スコア35660

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

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

jeanbiego

2020/06/23 14:05

うーん、すごい。短行なのに見事に動作しますね。 元の質問に関係ない上に横からで恐縮なのですが、よろしければ「 [*range(100+1)]」だけ動作原理を教えていただけませんでしょうか。 *がないとただの range(101)を要素に持つリストなのに、*があると[0,1,...,100]に展開されるのは見たことのない記法でした。
LouiS0616

2020/06/23 14:13 編集

[*イテラブル] と書くと要素を抽出できます。 [*range(100+1)] は list(range(100+1)) と同じですが、個人的に同種の括弧が連なるのが嫌いなのでちょっと捻くれた書き方をしています。 この書き方が真価を発揮するのは複数のイテラブルを混ぜたリストを作るときで、例えば tmp = [1, 2, 3] のとき [*tmp, 4, *tmp[::-1]] なんて書けば [1, 2, 3, 4, 3, 2, 1] になります。
jeanbiego

2020/06/23 14:15

なるほど、list()より柔軟性が高そうですね。忘れないうちに試してみます。 応用編まで説明していただき、ありがとうございました!
jeanbiego

2020/06/23 14:47

Qiita記事もありがとうございます。読んでみますね。
seta-nachan

2020/06/24 00:01

ありがとうございます。lambda式も勉強しようと思っていたところです。記事も合わせて読んでみます。
guest

0

ベストアンサー

おたずねの箇所について、分かりやすくインデックスと要素を並べてfor文で回してみると、下記のようになります。
これは、removeでlist1の要素が減ってしまうので、処理のたびにインデックスが一つずつズレてしまっていることに原因があります。

python3

1list1 = list(range(100)) 2for i, k in enumerate(list1): 3 print(i,k) 4 list1.remove(k) 5#0 0 6#1 2 7#2 4 8#3 6 9#(中略) 10#47 94 11#48 96 12#49 98

せっかくなので、手直し例の一つを載せておきます。

python3

1NN = 1 # int(input()) 2list1 = list(range(100)) 3list2 = [] 4for i in range(NN): 5 LL = [">","30"] # input().split() 6 hugo = LL[0] 7 kazu = int(LL[1]) 8 if hugo =='>': 9 for k in list1: 10 if k >= kazu: # 逆にして 11 list2.append(k) # 追加していく式にしました 12print(list2) 13#[30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

投稿2020/06/23 03:42

編集2020/06/23 03:47
jeanbiego

総合スコア3966

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

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

seta-nachan

2020/06/23 04:33

わかりました。普段はpop使うようにしていて新しくremoveを覚えようとしたのですが使ってみないとわからないことが多いですね。勉強になりました。ありがとうございます
jeanbiego

2020/06/23 14:07

私も最初気づきませんでした。調べるとどうも初学者のハマりやすいポイントの一つのようです。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問