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

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

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

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

Python

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

Q&A

1回答

579閲覧

複数のリストから重複しているものを元に必要なものだけを抽出したリストを作りたい

hinaseen

総合スコア0

Python 3.x

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

Python

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

1グッド

0クリップ

投稿2021/09/21 10:45

前提・実現したいこと

初質問です、至らぬ点があったらすみません。

list1 = [a,b,c]
list2 = [a,d,e]
list3 = [x,y,z]

上記のような3つのリストがあったら
list4 = [a,b,d]
list5 = [x,y]

以上のように、他のリストと重複しているものがあるときはまとめた上で必要な要素だけを抽出し、
他のリストと重複していないときは必要な要素だけを抽出したリストをそれぞれ作りたいです。

試したこと

for分を用いて試行錯誤したのですが自分ではうまくできませんでした。
よろしければ教えていただきたいです。

ForestSeo👍を押しています

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

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

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

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

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

meg_

2021/09/21 12:30

> 必要な要素だけを抽出し "必要な要素"って何ですか?
hinaseen

2021/09/21 14:16

上の例だと他のリストと重複している部分がなかったらlist3からは[x,y]だけを取り出したいということです
meg_

2021/09/21 14:26

> 上の例だと他のリストと重複している部分がなかったらlist3からは[x,y]だけを取り出したいということです 何故zを除外したのですか?どんなロジックなのですか?list4についてもロジックが全く分かりません。
hinaseen

2021/09/21 23:40

zは必要のない要素だったので削除しました。それぞれのリストに必要のない要素が入っている状況です。 list4に関してはaという共通した要素を取り出してb,cと必要な要素を付けます。
meg_

2021/09/22 00:55

個別の条件があるんですね。質問に書いてないので意味不明な質問に見えました。 もっと汎用的な関数でも作りたいのかと思いましたが違うということで理解しました。 > for分を用いて試行錯誤したのですが自分ではうまくできませんでした。 途中でも良いのでそのコードを載せないと丸投げに見えてしまいます。
guest

回答1

0

他のリストと重複しているものがあるときはまとめた上で必要な要素だけを抽出し、
他のリストと重複していないときは必要な要素だけを抽出したリストをそれぞれ作りたいです。

必要な要素 が 各リストの最初の2つ を意味し
他のリストと重複 が 他のリストと必要な部分で重複 を意味する場合

期待しているコードは

Python

1list1 = ['a', 'b', 'c'] 2list2 = ['a', 'd', 'e'] 3list3 = ['x', 'y', 'z'] 4list4 = ['b', 'f', 'g'] 5 6lst = [ls[:2] for ls in (list1, list2, list3, list4)] 7ovlp = [(i,k) for i in range(len(lst)) for k in range(i+1, len(lst)) if set(lst[i]) & set(lst[k])] 8mono = set(range(len(lst))) - set(n for ov in ovlp for n in ov) 9ans = [lst[i] for i in mono] + [sorted(set(lst[i]+lst[k])) for i,k in ovlp] 10print(ans) # [['x', 'y'], ['a', 'b', 'd'], ['a', 'b', 'f']]

あるいは次のコードかな。
ppaul さん ご指摘の不具合があったため別コードにしました。

Python

1list1 = ['a', 'b', 'c'] 2list2 = ['d', 'f', 'e'] 3list3 = ['x', 'y', 'z'] 4list4 = ['b', 'f', 'g'] 5 6def merge_list(lst: [[]]) -> [[]]: 7 prelen = len(lst) 8 ovlp = [(i,k) for i in range(len(lst)) for k in range(i+1, len(lst)) if set(lst[i]) & set(lst[k])] 9 mono = set(range(len(lst))) - set(n for ov in ovlp for n in ov) 10 ans = [lst[i] for i in mono] + [sorted(set(lst[i]+lst[k])) for i,k in ovlp] 11 return ans if len(ans) == prelen else merge_list(ans) 12 13lst = [ls[:2] for ls in (list1, list2, list3, list4)] 14print(merge_list(lst)) # [['x', 'y'], ['a', 'b', 'd', 'f']]

不具合のあった旧コードベースで修正すると次のコードになります。

Python

1list1 = ['a', 'b', 'c'] 2list2 = ['d', 'f', 'e'] 3list3 = ['x', 'y', 'z'] 4list4 = ['b', 'f', 'g'] 5 6def merge_list(lst: [[]]) -> [[]]: 7 prelen = len(lst) 8 ans = [] 9 for ls in lst: 10 for i, elm in enumerate(ans): 11 if set(ls) & set(elm): 12 ans[i] = sorted(set(ls + elm)) 13 break 14 else: 15 ans.append(sorted(ls)) 16 return ans if len(ans) == prelen else merge_list(ans) 17 18lst = [ls[:2] for ls in (list1, list2, list3, list4)] 19print(merge_list(lst)) # [['a', 'b', 'd', 'f'], ['x', 'y']]

以下は不具合のある旧コードです。

Python

1list1 = ['a', 'b', 'c'] 2list2 = ['a', 'd', 'e'] 3list3 = ['x', 'y', 'z'] 4list4 = ['b', 'f', 'g'] 5 6lst = [ls[:2] for ls in (list1, list2, list3, list4)] 7ans = [] 8for ls in lst: 9 for j, elm in enumerate(ans): 10 if set(ls) & set(elm): 11 ans[j] = sorted(set(ls + elm)) 12 break 13 else: 14 ans.append(sorted(ls)) 15 16print(ans) # [['a', 'b', 'd', 'f'], ['x', 'y']]

投稿2021/09/22 00:07

編集2021/09/22 04:08
lehshell

総合スコア1147

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

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

ppaul

2021/09/22 03:14

下のコードでデータを変えてみました。 >>> list1 = ['a', 'b', 'c'] >>> list2 = ['d', 'f', 'e'] >>> list3 = ['x', 'y', 'z'] >>> list4 = ['b', 'f', 'g'] >>> lst = [ls[:2] for ls in (list1, list2, list3, list4)] >>> ans = [] >>> for ls in lst: ... for j, elm in enumerate(ans): ... if set(ls) & set(elm): ... ans[j] = sorted(set(ls + elm)) ... break ... else: ... ans.append(sorted(ls)) ... >>> print(ans) [['a', 'b', 'f'], ['d', 'f'], ['x', 'y']]
lehshell

2021/09/22 04:09

失礼しました。考慮から漏れました。m(__)m
ppaul

2021/09/22 04:17

失礼ではありません。こうやって、すばやく手を動かす人は好感度が高いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問