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

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

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

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

Q&A

解決済

1回答

173閲覧

python 複雑なリスト計算

22Go

総合スコア55

Python

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

0グッド

0クリップ

投稿2019/05/19 09:26

編集2019/05/19 09:48

python

1data1 = [("a", "b", "100"),("c", "d", "90"),("e", "f", "80")] 2 3 4data2 = [("c", "d", "30"),("e", "f", "100"),("a", "b", "5")] 5

このような2つのデータにおいて
data1とdata2に共通するペアのスコアを合計して最大値をprintしたいです。

[data1:a b 100] + [data2:a b 5] = 105
[data1:c d 90] + [data2:c d 30] = 120
[data1:e f 80] + [data2:e f 100] = 180

data1にあるa,bというペアをdata2からどのように探して、計算していいかわかりません。

宜しくお願い致します。

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

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

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

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

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

hayataka2049

2019/05/19 09:36

どのようにデータを保持しているのかがわからないのと、このままでは実行可能ではないので、実際に保持されている状況がわかるように、かつ実行可能なコードに編集していただいた方が良いかと思います。 適当にリストのリストやDataFrameとみなして回答しても良いのですが、回答のコードがそのまま使えた方が質問者さんのメリットが大きいと思います。
22Go

2019/05/19 09:49

配慮が足りず、すみません。データの保持はリストのリストに変えることも検討してます。 宜しくお願い致します。
guest

回答1

0

ベストアンサー

素のpythonで書くとこうなります。

容易に処理するために辞書に変換し、ついでにintにしておきます。

python

1data1 = [("a", "b", "100"),("c", "d", "90"),("e", "f", "80")] 2data2 = [("c", "d", "30"),("e", "f", "100"),("a", "b", "5")] 3 4data1_dict = {(k1, k2):int(v) for k1, k2, v in data1} 5data2_dict = {(k1, k2):int(v) for k1, k2, v in data2} 6print(data1_dict) 7print(data2_dict) 8""" 9{('a', 'b'): 100, ('c', 'd'): 90, ('e', 'f'): 80} 10{('c', 'd'): 30, ('e', 'f'): 100, ('a', 'b'): 5} 11"""

キーの積集合を取り、それを使って結果の辞書を作ります。

python

1result = {k:data1_dict[k] + data2_dict[k] 2 for k in data1_dict.keys() & data2_dict.keys()} 3print(result) 4# {('c', 'd'): 120, ('e', 'f'): 180, ('a', 'b'): 105}

必要に応じてリストに戻します。

python

1result = [(k[0], k[1], v) for k, v in result.items()] 2print(result) # [('a', 'b', 105), ('c', 'd', 120), ('e', 'f', 180)] 3

投稿2019/05/19 09:56

hayataka2049

総合スコア30933

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

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

22Go

2019/05/19 10:27

ありがとうございます。非常にシンプルで理想に近づいたのですが 新たにエラーが出てしまいました。
hayataka2049

2019/05/19 10:28

エラーメッセージを教えてください
22Go

2019/05/19 10:30

moduleとdictcompのエラーが出てきました。
hayataka2049

2019/05/19 10:34

まず、出たエラーをそのままコピペしてください。また、質問文のがダミーデータで現実の状況と異なっているなら、必要な範囲で情報を追加してください。
22Go

2019/05/19 10:47

すみません、リアルデータが大量すぎて追加できないのですが エラーを検索したところ、ダミーデータでいう ("a", "a","100")といったk1,k2が同じものが見つかってしまいました。 なのでdictで参照できていなことがエラーの原因のようなのですが、どうしたらいいでしょうか。。。
22Go

2019/05/19 10:50

条件分岐でkeyが同じ時に何か処理する方がいいでしょうか?
hayataka2049

2019/05/19 10:50

私のコードは("a", "a","100")のようなものでも問題なく処理できます。 繰り返しになりますが、まずは出たエラーをそのままコピペしてください。コメント欄が狭ければ質問を編集して載せても構いません。
22Go

2019/05/19 10:57

Traceback (most recent call last): File "sample3.py", line 20, in <module> a = {k:h_e_dict[k] + e_h_dict[k] for k in h_e_dict.keys() and e_h_dict.keys()} File "sample3.py", line 20, in <dictcomp> a = {k:h_e_dict[k] + e_h_dict[k] for k in h_e_dict.keys() and e_h_dict.keys()} KeyError: ('NP_414542.1', 'NP_414542.1') 出たエラーはこちらです。
hayataka2049

2019/05/19 11:00

回答の&をandに直されたのですね。良かれと思ってやったのだと思いますが、意味が違います。今回は&が必要です。
22Go

2019/05/19 11:18

ありがとうございます。なぜ&でないといけないかという理由も解決いたしました。本当にありがとうございます!
hayataka2049

2019/05/19 15:21 編集

解決して何よりです。ちなみに私のコードは[("a", "b", "100"),("a", "b", "90")]など辞書のキーになる部分が重複している場合は期待通り動かない可能性がある(どういう動作を期待しているのかにもよりますが)ので、もしそうであればご注意ください。言っていただければ代替案を考えます。 ちょっと凶悪なつまづきポイントだと思ったのでブログのネタにさせていただきました。よろしければご覧ください。 https://www.haya-programming.com/entry/2019/05/20/000528
22Go

2019/05/25 06:54

度々失礼いたします。 データをhayataka2049さんの案の通りに動かしていたところ辞書のキーが重複していました。。。。 その場合”v”が大きい値を取り出したいのですがどうしたらいいでしょうか? 取り出すタイミングはresult = [(k[0], k[1], v) for k, v in result.items()] print(result) # [('a', 'b', 105), ('c', 'd', 120), ('e', 'f', 180)]の後でリストから取り出そうかと思いました。キーと値の確認をif分で入れてみようかと考えたのですが、結局うまくいかずのところです。。。
hayataka2049

2019/05/25 14:43 編集

その場合は辞書に変換するタイミングでなんとかする必要があります。 動作確認していませんが、こんな感じでいいのでは。 data1_dict = dict() for k1, k2, v in data1: if v > data1_dict.get((k1, k2), -float("inf")): data1_dict[(k1,k2)] = v
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問