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

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

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

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

Q&A

解決済

2回答

483閲覧

Python リストに格納した関数を、別のリストにおいてインデックスが同じ位置にある変数がTrueの時だけ実行したい

yukimz

総合スコア8

Python

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

0グッド

0クリップ

投稿2020/04/10 09:19

リストに格納した関数を、別のリストにおいてインデックスが同じ位置にある変数がTrueの時だけ実行したいです。
ただ、こうした考え方が、下記で例に挙げていることをしたい解として、正しいかもわかりかねております。
考え方を変える必要がある場合は、その点もご教示頂けますと大変助かります。

例:1という数値が含まれるリスト(numbers)が与えられた際に、数値を2倍する関数で得られた[1,2]というリストに対して、次に数値を3倍する関数を適用し、[1, 2, 3, 6]という結果を得たい。ただし、別のリスト(methods)の同じインデックス位置がtrueの時だけ実行したい。

■インプット
[1]

■得たい結果
・bai2, bai3がいずれもTrueの場合 →[1, 2, 3, 6]
・bai2=False, bai3=Trueの場合 →[1, 3]
・bai2=True, bai3=Falseの場合 →[1, 2]

import numpy as np num = int(1) # 得たいリストを計算する関数の定義 def scratch_num(num, bai2=False, bai3=True): # booleanのリスト methods = [bai2, bai3] # 関数用リスト function = np.array([ lambda x: x * 2, lambda x: x * 3 ]) # 結果リスト numbers = [num] # 結果リストに対して、関数リストを適用 for f in function: tmp = [] # f の適用結果を記録する一時的な配列 for x in numbers: y = f(x) tmp.append(y) numbers.extend(tmp) return numbers # 関数の実行 numbers = scratch_num(num) # 結果の出力 print(numbers)

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

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

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

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

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

TakaiY

2020/04/10 10:09

質問は何ですか? - アルゴリズムとして正しいかどうか? ある入力に対して想定通りの結果が得られるのであれば、正しいでしょう。 得られないのであれば、どのような入力でどのような結果が出てしまうのか追記してください。 - 他のアルゴリズムが知りたいですか? 他のやりかたはたくさんありますが、ここはそういう漠然としたことを聞く場所ではないので、 もっと考えてから質問したほうがいいですよ。
yukimz

2020/04/10 10:43

@TakaiYさま 追記いただきありがとうございます。質問は、現状のコードでは、関数と真偽値の紐づけが出来ていない(どうやるかがわからない)ため、それをどのように行うか?(コードのどの部分を直すか?)ということでした。何を聞きたいかを明確にして質問するように留意いたします。
guest

回答2

0

ベストアンサー

こんな感じでどうでしょう?

python3

1# 関数 2bai2 = lambda x: x * 2 3bai3 = lambda x: x * 3 4plus1 = lambda x: x + 1 5plus2 = lambda x: x + 2 6minus5 = lambda x: x - 5 7 8# 関数のリスト 9funcs = [bai2, bai3, plus1, plus2, minus5] 10 11# 関数を実行するかしないかのフラグのリスト 12flags = [True, False, True, False, True] # => bai2, plus1, minus5 を実行する 13 14# 関数を適用するリストの初期値 15numbers = [1] 16 17# funcs と flags を zip で組み合わせてループさせる 18for func, flag in zip(funcs, flags): 19 if flag: 20 numbers += [func(x) for x in numbers] # => [1, 2, 2, 3, -4, -3, -3, -2] 21 22 23print(numbers) 24

投稿2020/04/10 10:32

jun68ykt

総合スコア9058

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

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

yukimz

2020/04/10 10:44

リストを結合して、Trueの場合だけ実行させる、というのを、zipで実現するんですね! ありがとうございます!大変助かりました。
jun68ykt

2020/04/10 11:43

どういたしまして > 大変助かりました。 とのことで、よかったです????
guest

0

その後、自己解決した方法としては、質問のコードの下記部分の修正でいけました!

for f in function[methods]: #もともとは"for f in functionとしていたが、[methods]を追加することで、Trueの場合のみ実行可能となった。 tmp = [] # f の適用結果を記録する一時的な配列 for x in images: y = f(x) tmp.append(y) images.extend(tmp)

投稿2020/04/10 10:50

yukimz

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問