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

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

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

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

Q&A

解決済

3回答

501閲覧

リストから条件に一致するデータだけ新しくリストにする

sasaki0628

総合スコア106

Python 3.x

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

0グッド

0クリップ

投稿2023/01/13 07:10

リストから条件に一致するデータだけ新しくリストにする書き方がわかりません。

以下のリストがあります。

q = [ { "id": 1, "fruits": "apple", "cd": [1,2,3] }, { "id": 2, "fruits": "banana", "cd": [1] }, { "id": 3, "fruits": "grape", "cd": [2,3] } ]

入力されたリストの値が cd のリストに含まれていることを条件にして出力内容を変更したいです。

input = [1] のときの出力内容

r = [ { "id": 1, "fruits": "apple", "cd": [1,2,3] }, { "id": 2, "fruits": "banana", "cd": [1] } ]

input = [1,3] のときの出力内容

r = [ { "id": 1, "fruits": "apple", "cd": [1,2,3] } ]

input = [2,3] のときの出力内容

r = [ { "id": 1, "fruits": "apple", "cd": [1,2,3] }, { "id": 3, "fruits": "grape", "cd": [2,3] } ]

作成したコード

r = [] input = [2,3] # input = [2,3]の場合 for item in q: if input[0] in item["cd"] and input[1] in item["cd"]: r.append(item) print(r)

inputの条件の個数に対して動的に書くことができていません。要素の個数に関係なく出力する書き方を教えていただきたいです。

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

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

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

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

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

guest

回答3

0

can110さんの回答と同様にsetに変換しinputの要素が各cdに含まれるかの判定に <= を使う案です:

Python

1r = [e for e in q if {*input} <= {*e['cd']}]

a と b がsetである場合に、a <= b は a が b の部分集合である場合に True となり、そうでない場合に False になります。

投稿2023/01/13 08:30

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sasaki0628

2023/01/15 05:56

回答ありがとうございます。シンプルでわかりやすいです。
guest

0

ベストアンサー

python

1q = [ 2 {"id": 1, "fruits": "apple", "cd": [1,2,3]}, 3 {"id": 2, "fruits": "banana", "cd": [1]}, 4 {"id": 3, "fruits": "grape", "cd": [2,3]} 5] 6 7for inp in ([1], [1, 3], [2, 3]): 8 r = [*filter(lambda x: all(i in x['cd'] for i in inp), q)] 9 print(f'{inp} => {r}') 10 11# [1] => [{'id': 1, 'fruits': 'apple', 'cd': [1, 2, 3]}, {'id': 2, 'fruits': 'banana', 'cd': [1]}] 12# [1, 3] => [{'id': 1, 'fruits': 'apple', 'cd': [1, 2, 3]}] 13# [2, 3] => [{'id': 1, 'fruits': 'apple', 'cd': [1, 2, 3]}, {'id': 3, 'fruits': 'grape', 'cd': [2, 3]}]

投稿2023/01/13 08:00

melian

総合スコア19714

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

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

sasaki0628

2023/01/15 05:56

回答ありがとうございます。filterを知りませんでした。勉強になります。
sasaki0628

2023/02/05 07:50

時間が経ってから見直したときにこちらの書き方が一番わかりやすく感じました。ありがとうございました。
guest

0

どちらも集合(set)として扱うことで、入力から引いた結果が空集合=入力されたすべての要素を含む と判定できます。

Python

1q = [{'id': 1, 'fruits': 'apple', 'cd': [1, 2, 3]}, 2 {'id': 2, 'fruits': 'banana', 'cd': [1]}, 3 {'id': 3, 'fruits': 'grape', 'cd': [2, 3]}] 4for inp in [[1],[1,3],[2,3]]: 5 r = [i for i in q if len(set(inp) - set(i['cd'])) <= 0 ] 6 print(inp,r) 7 8# [1] [{'id': 1, 'fruits': 'apple', 'cd': [1, 2, 3]}, {'id': 2, 'fruits': 'banana', 'cd': [1]}] 9# [1, 3] [{'id': 1, 'fruits': 'apple', 'cd': [1, 2, 3]}] 10# [2, 3] [{'id': 1, 'fruits': 'apple', 'cd': [1, 2, 3]}, {'id': 3, 'fruits': 'grape', 'cd': [2, 3]}]

投稿2023/01/13 07:47

編集2023/01/13 07:55
can110

総合スコア38262

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

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

sasaki0628

2023/01/15 05:56

回答ありがとうございます。型を集合にして計算するとうまくいくんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問