下記のコードを書くいて
51で割って余りが0と1の数字以外のリストを作りたく下記のコードをかきました.
しかし,出力が思うとおりになりません.
何故ですか.
とくに51で割って余りが1の数字が消えないのはなぜですか.
import pandas as pd import numpy as np num_list = list(range(1,7202)) remove_list = [x for x in num_list if x % 51 != 0 & x % 51 != 1]
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
註: この回答は編集前の質問に対するものです。
Python
remove_list2 = [x for x in num_list1 if x % 51 != 1 ]
num_list1 ⇒ remove_list1 では?
そもそもnum_list1は何のために用意してあるのですか?
エラーを消すためにその場限りの対応を繰り返すと、問題が潜在化するだけです。
投稿2019/01/16 13:15
編集2019/01/17 02:38総合スコア35660
0
下記のコードを書くいて
51で割って余りが0と1の数字以外のリストを作りたく下記のコードをかきました.
しかし,出力が思うとおりになりません.
何故ですか.
とくに51で割って余りが1の数字が消えないのはなぜですか.
演算子の意味と演算子の優先順位に誤解があるからです
- &はbitand
ビットでのand演算は、二進数で見たときに、両方のビットが立っているときだけ1にする演算です
1100 &1010 ----- 1000
こういう計算になります。
- 演算子の優先順位
[x for x in num_list if x % 51 != 0 & x % 51 != 1]]
こちらのifの中には%と!=と&がありますが、優先度順に言うと、%, &, !=となります(多くの言語で比較演算の優先度は低いです)
従ってこのifは
(x % 51) != (0 & (x % 51)) != 1
と同義です
これで、51でわったあまりを考えると
python
1# 51でわってあまりが0のとき 2print(0 != (0 & 0) != 1) # %を計算するとこう 3print(0 != 0 != 1) # &を計算するとこう 4# !=が複数ある場合「それぞれ異っていますか」という意味なので(結合がおきない)、この結果はFalseです(同じものがある == 「異なっている」ことはない) 5 6# 51でわってあまりが1のとき 7print(1 != (0 & 1) != 1) # %を計算するとこう 8print(1 != 0 != 1) # &を計算するとこう 9# !=が複数ある場合「それぞれ異っていますか」という意味なので(結合がおきない)、この結果はFalseであって欲しいのですが、!=で複数項を比較したとき、全ての組み合わせが評価されるわけではないので(あくまで左から順に見ただけでしかない)、この場合1と0が違う、0と1が違う、でそれぞれ異なっています=Trueが返されます。従ってあまり1のときがリストから消えません。
ちなみに余りが2から50である任意のnについては、n != 0 != 1
となり、それぞれ異なっているのでTrueとなります。
言いかえれば、あまり0がリストから消えたのも、あまり2から50までが残ったのも、コーダーの意図によらず欲しい結果と似た結果に偶然なったということです(コーダーの意図からすればあまり1がおかしいんじゃないくて、全部おかしい)。
個人的にはそういう計算は好きではないですが&
はboolどうしで演算する限りにおいてはandと似た(同じかどうかは知らない、andは短絡評価があるかもしれないので)結果を出すので
質問者様の当初コードも
python
1remove_list = [x for x in range(1,7202) if (x % 51 != 0) & (x % 51 != 1)]
このように書けば、要件通り動作します。
なお、こういった場合には一例として
python
1for x in range(1, 52): 2 print(x, x % 51 != 0,x % 51 != 1,x % 51 != 0 & x % 51 != 1,(x % 51) != (0 & (x % 51)) != 1,(x % 51 != 0) & (x % 51 != 1))
こういうことをして、値がどう評価されるか検証してください(もちろん、カッコの組み合わせは正解パターンで書いてますが、私はいろいろ試しました)
投稿2019/01/17 01:58
編集2019/01/17 02:02総合スコア12705
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
参考情報
- Python3におけるmap/filterの使い方
http://hiroto1979.hatenablog.jp/entry/2016/02/24/020534
内包記法での方法だけでなく、 filter をつかってみたり、 groupby で 51 で割ったあまりでグループ分けして処理したりする方法も練習してみると良いです。
投稿2019/01/16 22:22
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/16 13:29
2019/01/16 13:30
2019/01/16 13:39
2019/01/16 13:44 編集
2019/01/16 13:55
2019/01/16 13:57