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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

2回答

1577閲覧

2つのlistを、いわゆる完全外部結合をして表示させたい

Koto_2131

総合スコア4

Python 3.x

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2021/06/25 04:58

編集2021/06/25 05:26

対応するキー値を持つ2つのリストがあり、同じキー値なら1行に、なければ片方の欄を空白にして表示させたいです。

やってみたこと
自分でアルゴリズムを考えたが至らなかった
完全外部結合 アルゴリズム 等で調べたが他言語での実装も見つけられなかった

list_join.py

1a = ["a1","b4","f2"] 2b = ["a1","a5","f2"] 3 4print("list:a".ljust(10),"list:b") 5 6for lisa in a: 7 for lisb in b: 8 if lisa == lisb: 9 print(lisa.ljust(10),lisb) 10    #対応する値がない時に片方だけ表示させるアルゴリズムがわからない

こんな感じで出力させたい(順番はどうでもいい)

list:a list:b a1 a1 b4 a5 f2 f2

どうかご教授のほどよろしくお願いいたします。

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

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

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

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

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

quickquip

2021/06/25 05:11

こういう場合自然言語に頼らず、期待する結果をコード(リテラル)で、何例か書いておくとよいですよ。
Koto_2131

2021/06/25 05:25

アドバイスありがとうございます。 一例ですが、出力例を追記いたしました。
guest

回答2

0

集合(set)を使うと、両方・片方に存在する要素の取り出しは

python

1a = set(["a1","b4","f2"]) 2b = set(["a1","a5","f2"]) 3 4 # 順序は不定 5print(a | b) # {"a5", "f2", "b4", "a1} 6print(a & b) # {"f2", "a1"} 7print(a - b) # {"b4"} 8print(b - a) # {"a5"}

のように記述できます。


python

1a = ["a1","b4","f2"] 2b = ["a1","a5","f2"] 3 4def full_outer_join(*args): 5 # リストの平坦化 chain([1,2], [3,4]) => [1,2,3,4] 6 from itertools import chain 7 8 # 集合のリストに変換 `value in list` -> `value in set` の効率化 O(n) -> O(1) を期待 9 # [{"a1", "b4", "f2"}, 10 # {"a1", "a5", "f2"}] 11 xs = list(map(set, args)) 12 13 # 結合 {"a1", "b4", "a5", "f2"} 14 for key in sorted(set(chain(*xs))): 15 yield ( 16 # 引数に与えられたグループ内での存在チェック 17 # null 値は未定義なので、とりあえずここでは表示側で楽できるように空文字 18 19 (key if key in x else "") for x in xs 20 ) 21 22for x, y in full_outer_join(a, b): 23 print(f"{x:10} {y:10}") 24 25 26c = ["c1", "a5"] 27for x, y, z in full_outer_join(a, b, c): 28 print(f"{x:10} {y:10} {z:10}")

汎用的な処理に落とし込むと

  • キーの一覧を抽出 {"a1", "b4", "a5", "f2"}

 集合(set) で重複を省き、sorted で並べ替え。

  • 各カラム内にキーがあるかを確認

 実装例としては集合の他に、辞書やcollections.defaultdict を使う等。方法は様々。

  • 書式指定して表示

投稿2021/06/25 06:23

teamikl

総合スコア8664

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

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

0

ベストアンサー

「アルゴリズム」っつーのが何を指してるのかわからんけど、愚直にやれば誰でもできると思いますが。
説明が欲しいってなら

  1. aのループを回す
  2. aから取り出した要素aiが、bに含まれているかどうかチェックする

2.1. 含まれていない場合、「片方を空白にして」(質問文の表現を引用)表示する。
2.2. 含まれている場合「1行に」(質問文の表現を引用)表示し、aiと同値の要素をbから削除する。
3. aのループ完了後、bにのみ含まれる要素が残るので、bをループして「1行に」表示する。

これをコードに起こすだけ。
こういう方法以外をご所望なら、どんなやり方を想定しているのかは質問文に書いといて欲しいけど。

投稿2021/06/25 05:31

gentaro

総合スコア8949

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

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

Koto_2131

2021/06/25 05:45

回答ありがとうございます。 チェックが終わった要素の管理が確認用の変数を作るくらいしか浮かばず、さすがに冗長すぎないかということで質問いたしました。 確かに読み終わったものを削除してしまえばすごい簡単ですね、要素を削除するということが頭に出てきませんでした。 まだまだ思考が固いと実感しました。精進いたします。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問