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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

204閲覧

python 条件を満たす値が入ったリストを作りたい

Tubasa1995

総合スコア83

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/01/16 13:11

編集2019/01/16 13:28

下記のコードを書くいて
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ページで確認できます。

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

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

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

guest

回答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
LouiS0616

総合スコア35660

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

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

Tubasa1995

2019/01/16 13:29

すいません間違えていました. ただ,書き直したのですが,51で割って余りが1の数字が消えないのはなぜでしょうか.51で割って余り0のところは消えているのですが.
LouiS0616

2019/01/16 13:30

& を and に変えましょう。
Tubasa1995

2019/01/16 13:39

num_list = list(range(1,7202)) remove_list = [x for x in num_list if x % 51 != 0 & x and 51 != 1] print(remove_list) np.savetxt('test_out.csv', remove_list, delimiter=',') これで実行してますが,なにがダメなのでしょうか.
LouiS0616

2019/01/16 13:44 編集

& と % は違う文字です。& を and に変えましょう。
Tubasa1995

2019/01/16 13:55

すいません,勘違いしていたのですが, 余りが0お1のものが欲しかったのを勘違いしてました. ただ,下記のようにコードを書き直したのですが,出力が空です.なぜですか. remove_list = [x for x in num_list if x % 51 == 0 and x % 51 == 1]
LouiS0616

2019/01/16 13:57

『51で割って余り0』且つ『51で割って余り1』である数など存在しないからです。
guest

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
papinianus

総合スコア12705

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

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

0

参考情報

  • Python3におけるmap/filterの使い方

http://hiroto1979.hatenablog.jp/entry/2016/02/24/020534

内包記法での方法だけでなく、 filter をつかってみたり、 groupby で 51 で割ったあまりでグループ分けして処理したりする方法も練習してみると良いです。

投稿2019/01/16 22:22

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問