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

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

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

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

Python

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

Q&A

解決済

5回答

969閲覧

代入先を条件で変えるif/elseをワンライナーで書きたい

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2020/06/20 21:41

if文の結果によってparent.left, parent.rightのどちらの変数に代入するかが変わる4行の文を、ワンライナーでかくことはできるのでしょうか?
木構造を書いていて下記のような4行が度々出てくるので、短くなればいいなーと思っています。

Python

1if node.value < parent.value: 2 parent.left = node.left 3else: 4 parent.right = node.left 5 6# 下記のようなワンライナーは可能? 7# (parent.left if node.value < parent.value else parent.right) = node.left

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

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

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

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

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

meg_

2020/06/20 23:26

繰り返し出てくる処理なら関数化してはどうでしょうか?
退会済みユーザー

退会済みユーザー

2020/06/20 23:33

似たような構文が出てくるというだけで、条件や代入値に共通点があまりないのです。 そもそも、immutableなので...
meg_

2020/06/20 23:41

if文の条件が変わるんですか。質問文からはそこまで読み取れずご希望に添えませんでした。
quickquip

2020/06/21 01:19

> そもそも、immutableなので... はどういう意味でしょう?? 順当に考えたら parent.right = というような属性の書換を許さないということかと思ってしまうのですが。 (本筋とは関係ないのですが)
guest

回答5

0

ベストアンサー

質問のように書くのが一番いいと思います。

パズルとして考えるなら

python

1if node.value < parent.value: 2 parent.left = node.left 3else: 4 parent.right = node.left

python

1parent.left, parent.right, *_ = (parent.left, node.left, parent.right)[node.value < parent.value:]

と書き換え可能です。
(parent.left, parent.rightが属性としてもともと存在するという条件下で)


追記

クラスにsetterメソッドを用意して

python

1(parent.set_left if node.value < parent.value else parent.set_right)(node.left)

とするのが1行で書けてかつ意味論的にもわかりやすい、ちょうどいい着地点かなと思いました。

投稿2020/06/21 01:27

編集2020/06/22 01:50
quickquip

総合スコア11235

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

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

LouiS0616

2020/06/21 02:01

+10票くらい入れたいです。
退会済みユーザー

退会済みユーザー

2020/06/21 16:44

おおー、発想に脱帽です。
quickquip

2020/06/22 01:51

思いついたことがあるので追記しました。(過分に+をもらっている気がします)
guest

0

あまり行儀はよくありませんが、eval使うよりはマシかなと。

Python

1parent.__dict__['left' if node.value < parent.value else 'right'] = node.left

投稿2020/06/21 02:01

raccy

総合スコア21739

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

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

LouiS0616

2020/06/21 03:03

文字列で評価するならsetattrの方が問題に即していて良いのかなと。
guest

0

update(parent, node) としてメソッド定義して、
そのなかで、 if... else ... で parent の left, right を更新する処理を書くのが良いと思います。

投稿2020/06/22 00:16

katoy

総合スコア22324

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

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

0

代入先を変えるのは、1行は無理かもしれませんが2行なら、

Python

1if node.value < parent.value: parent.left = node.left 2else: parent.right = node.left 3```とか

投稿2020/06/20 21:52

編集2020/06/20 21:53
ForestSeo

総合スコア2722

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

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

ForestSeo

2020/06/20 21:57

たまに簡単なif文の時、 例) if x == 5: b = 9 とか改行せずに書きます。
退会済みユーザー

退会済みユーザー

2020/06/20 23:11

blackによる強制フォーマットが入るので、結局改行されてしまうんです...
ForestSeo

2020/06/21 01:35 編集

ならそのままの方がいいんじゃないですか?
guest

0

以下↓を参考に・・・
Python 三項演算子の書き方

投稿2020/06/20 21:50

cateye

総合スコア6851

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

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

退会済みユーザー

退会済みユーザー

2020/06/20 23:13

三項演算子は代入値には使えますが、代入先の変数の選択には使えません。 それに似たことができないか...というのが質問した理由です
cateye

2020/06/21 00:41

あ!失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問