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

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

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

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

Q&A

解決済

1回答

2103閲覧

Pythonのfilter関数が意図したように動かない理由

Justmeaning

総合スコア13

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

0グッド

0クリップ

投稿2016/06/25 13:22

Pythonのfilterを使ってリスト内の特定の部分を取り出そうとしているのですが、うまくいきません。
Pythonの入門書を読み終わり、自分でプログラミングを始めたのですが、filter関数の情報が少なく使い方をあまり理解できていないために以下のことが発生しています。

source:
print(filter(lambda c: c > 0, [-1, 0, 1, [4, -10], 100]))
print(filter(lambda b: b=="juice",[["juice","banana"],["jam","orange"],["fruit","banana"],["juice","apple"]]))
output: [1, [4, -10], 100]
[]

やりたいことは、source2行目でペアになっているリストのもう片方の言葉の抽出です。("banana","apple"といった感じに)
なぜ上記のようなことが起きているのでしょうか。

リストが2重以上になっているときのfilterの挙動について教えていただけると助かります。

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

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

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

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

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

guest

回答1

0

ベストアンサー

次のように、filterlambdaの代わりに関数fを渡して、filterが取り出している値をチェックしてみましょう。

lang

1def f(b): 2 print(b) 3 return b == 'juice' 4 5a = [["juice","banana"],["jam","orange"],["fruit","banana"],["juice","apple"]] 6 7print(filter(f, a)) 8 9#['juice', 'banana'] 10#['jam', 'orange'] 11#['fruit', 'banana'] 12#['juice', 'apple'] 13#[]

これで分かることは、lambdaのときの変数bには、['juice', 'banana']['jam', 'orange']のようなリストの値がセットされてくるということです。
リストに対してb == "juice"としても必ずFalseになってしまいます。

b[0] == "juice"とすることで、目的のものが選択されるようになります。

さらに、結果として['banana', 'apple']だけが欲しいということであれば、今度はmap関数を使ってリストを1番目の要素だけの値に変換する必要があります。

投稿2016/06/25 13:38

編集2016/06/25 13:41
argius

総合スコア9388

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

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

Justmeaning

2016/06/25 15:23

動作の検討方法まで教えていただいてありがとうございます! ソースを修正してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問