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

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

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

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

Q&A

解決済

1回答

432閲覧

キー値とペアの製作、編集

genbara

総合スコア1

Python

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

0グッド

0クリップ

投稿2023/05/18 03:44

編集2023/05/18 05:13

実現したいこと

mydict = { ('A', 'B'): { 'G', 'H' },('C', 'D'): { 'I', 'H' },('E', 'F'): { 'G' }}
上記のような辞書を与えられたとき重複している値を修正して以下のようなそれぞれのキーに一意の値が割り当てられている形に変更したいです。🙇‍♂️
mydict = { ('A', 'B'): { 'H' },('C', 'D'): { 'I' },('E', 'F'): { 'G' }}

前提

importはなしでお願いします💦

手順:
mydict = { ('A', 'B'): { 'G', 'H' },('C', 'D'): { 'I', 'H' },('E', 'F'): { 'G' }}

#辞書内で重複していてペアがいるものを探してもしいたら消す。
#値{ 'G' }を消してしまうと('E', 'F')の値がなくなるので('A', 'B')の値{ 'G', 'H' }の'G'をけす。
mydict = { ('A', 'B'): { 'H' },('C', 'D'): { 'I', 'H' },('E', 'F'): { 'G' }}

#値{ 'H' }を消してしまうと('A', 'B')の値がなくなるので('C', 'D')の値{ 'I', 'H' }の'H'をけす。
mydict = { ('A', 'B'): { 'H' },('C', 'D'): { 'I', 'H' },('E', 'F'): { 'G' }}

上記の手順をいくつかの同じような辞書で試せるようにしたいです。
また、以下のような値を一意にできない辞書の場合はNoneを返したいです。
mydict = { ('A', 'B'): { 'E' },('C', 'D'): { 'E' }}

長くなりましたがよろしくお願いします。🙇‍♂️

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

python

1#キーを格納 2newlist = {} 3 4#値を抽出 5new_list = {} 6for item_set in games.values(): 7 new_list.append(list(item_set)) 8def unique_keys(lst): 9 seen = {} 10 result = [] 11 for item in lst: 12 if item not in seen: 13 seen[item] = True 14 result.append(item) 15 return result 16 17i = 0 18for step in len(new_list ): 19 newlist[i] = {result[i]}#重複していない値を埋め込む 20 i = i + 1

試したこと

該当のソースコードではキーと値を一度分解して値が重複しているものを探そうとしたものですが。そもそもの考え方が間違っているかもしれないので役に立たないかもしれないです。💦
値を抽出、比較して一意になった後にもう一度値をもとのキーに割り当てればいいと思っていましたが、重複している値を検索、消去する方法がわからなくて止まっています。

補足情報(FW/ツールのバージョンなど)

使用しているのはpython(3.10.6)

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

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

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

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

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

TakaiY

2023/05/18 04:27 編集

質問の中で「リスト」とされているものに、1つもリストがありません。 辞書なのか、タプルなのか、セットなのかを明確にしていただけますか。 用語が間違えているので、何がしたいのかがよくわかりません。 たとえば「():{}をひとまとまりにして{}ないを()の監督にしたい」の部分は、 ():{} は辞書のキー(タプル)と値(セット)に見えますので、ひとまとまりしてというのがどういう操作なのか不明ですし、 「{}内を()の監督にしたい」も意味がわかりません。 突然「監督」「審判」という言葉がでてきますが、どのデータの何を指しているのかわかりません。 これらについて説明するか、一般的な用語(キーとか値とか)で説明おねがいします。
quickquip

2023/05/18 05:33

G→Hの順に実行している例がありますがその順は決定的ですか? そうでないとして、H→Gの順に実行した時に結果は決定的でなくなりますが許容しますか? mydict = { ('A', 'B'): { 'H', 'I' },('C', 'D'): { 'I', 'J' },('E', 'F'): { 'J', 'H' }} みたいなデッドロックするようなケースでは期待する結果が2通りありそうですが、どうなるべきですか? (適当に消していって重複が取り除かれればOK?)
genbara

2023/05/18 05:36

順番は決定的である必要はありません。2通りある場合はランダムで構いません。重複が取り除かれれば大乗です🙏
guest

回答1

0

ベストアンサー

基本的には先頭から順に要素を取得していきます。
そのさい、すでに取得しているものは取得しません。
それを再帰で最後までおこない、結果があればそれを返します。

Python

1def get(dct): 2 keys = dct.keys() 3 vals = [tuple(v) for v in dct.values()] # setはtupleに 4 LEN = len(dct) 5 6 def find(pos=0, ret=[]): 7 8 # 見つかった 9 if pos >= LEN: 10 return ret 11 12 for i in vals[pos]: 13 if i not in ret: 14 cur_ret = find(pos+1, ret+[i]) 15 if cur_ret: 16 return cur_ret 17 return None 18 19 ret = find() 20 if not ret: 21 return None 22 return {k:set(v) for k,v in zip(keys, ret)} 23 24for dct in [ 25 { ('A', 'B'): { 'G', 'H' },('C', 'D'): { 'I', 'H' },('E', 'F'): { 'G' }}, 26 { ('A', 'B'): { 'H', 'I' },('C', 'D'): { 'I', 'J' },('E', 'F'): { 'J', 'H' }}, 27 { ('A', 'B'): { 'E' },('C', 'D'): { 'E' }} 28 ]: 29 print(dct) 30 ret = get(dct) 31 print(ret) 32""" 33{('A', 'B'): {'H', 'G'}, ('C', 'D'): {'H', 'I'}, ('E', 'F'): {'G'}} 34{('A', 'B'): {'H'}, ('C', 'D'): {'I'}, ('E', 'F'): {'G'}} 35{('A', 'B'): {'H', 'I'}, ('C', 'D'): {'J', 'I'}, ('E', 'F'): {'H', 'J'}} 36{('A', 'B'): {'H'}, ('C', 'D'): {'I'}, ('E', 'F'): {'J'}} 37{('A', 'B'): {'E'}, ('C', 'D'): {'E'}} 38None 39"""

投稿2023/05/18 07:11

can110

総合スコア38266

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問