Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

一つのキーに複数の値を辞書型で保存する方法

VSCodeでPythonのコードを書いています。
あるプログラマーの方に課題を出して頂いたのですが、今回は自力で解決できなかったため、こちらで質問させてください。
一つのキーに複数の値を辞書型で保存したいです。

age = [25, 30, 18, 52, 68, 41, 55, 24, 19, 36, 40, 62]
sex = ['man','woman','woman','woman','man','woman','man','man','man','woman','man','woman']

list_dict = dict(zip(age,sex))
for age, sex in list_dict.items():
    print(age, sex)

print(list_dict)
#{25: 'man', 30: 'woman', 18: 'woman', 52: 'woman', 68: 'man', 41: 'woman', 55: 'man', 24: 'man', 19: 'man', 36: 'woman', 40: 'man', 62: 'woman'}

*ageが主キー

今の段階だと、ageリストの[18]に対応するのは、sexリストの'woman'だけです。これに加え、同じキーに'man'を追加したいです。

以下のような表示にしたいです。

理想形

print(list_dict)
#{25: 'man', 30: 'woman', 18: 'woman','man', 52: 'woman', 68: 'man', 41: 'woman', 55: 'man', 24: 'man', 19: 'man', 36: 'woman', 40: 'man', 62: 'woman'}

自分で試したこと

調べると、一つのキーに複数の値を辞書型で保存するのはPythonでは不可能だという答えがいくつかありました。しかし、同じようなことで悩んでおられる方の質問を見ると、やはりfor文を使って上手くいっている場合もあるのだと知りました。自分なりにdefaultdictやappendを使ってみたのですが、上手くいきません。

ネスト構造を使って試すと一応できましたが、思っているのとは少し違いました。

list_dict[18] = {1:'woman',2:'man'}
print(list_dict)
#{25: 'man', 30: 'woman', 18: {1: 'man', 2: 'woman'}, 52: 'woman', 68: 'man', 41: 'woman', 55: 'man', 24: 'man', 19: 'man', 36: 'woman', 40: 'man', 62: 'woman'}

皆様お忙しい中恐縮ですが、ご指摘頂けると幸いです。

0 likes

3Answer

そもそもどういったことをやりたいのでしょうか?

年齢と性別という、N:Nのような関係性のものを辞書型で保持しようとしていることがいけてないような気がします。

辞書のキーには重複がないような値を利用するイメージでしたが、そもそもどういったことを実現しようとしてそのようなつくりにしようとしているのかが気になりました。

人の情報を管理したいのであれば、年齢と性別という変数を持った人クラスを作るのもひとつの手かもしれません。

2Like

Comments

  1. @forforfor1760

    Questioner

    たしかに仰る通りかもしれません。回答ありがとうございます。

複数の値はリスト、タプル、辞書などでまとめます。
リストににするならこんな感じです。

age = [25, 30, 18, 52, 68, 41, 55, 24, 19, 36, 40, 62, 18]
sex = ['man','woman','woman','woman','man','woman','man','man','man','woman','man','woman', 'man']

age_sex = {}
for age, sex in zip(age, sex):
    age_sex.setdefault(age, []).append(sex)

print(age_sex)
#{25: ['man'], 30: ['woman'], 18: ['woman', 'man'], 52: ['woman'], 68: ['man'], 41: ['woman'], 55: ['man'], 24: ['man'], 19: ['man'], 36: ['woman'], 40: ['man'], 62: ['woman']}

文字列とリストを混在させるなら処理が複雑になります。

age = [25, 30, 18, 52, 68, 41, 55, 24, 19, 36, 40, 62, 18]
sex = ['man','woman','woman','woman','man','woman','man','man','man','woman','man','woman', 'man']

age_sex = {}
for age, sex in zip(age, sex):
    if age in age_sex:
        if isinstance(age_sex[age], str):
            age_sex[age] = [age_sex[age]]
        age_sex[age].append(sex)
    else:
        age_sex[age] = sex

print(age_sex)
#{25: 'man', 30: 'woman', 18: ['woman', 'man'], 52: 'woman', 68: 'man', 41: 'woman', 55: 'man', 24: 'man', 19: 'man', 36: 'woman', 40: 'man', 62: 'woman'}
2Like

Comments

  1. @forforfor1760

    Questioner

    コード含めた丁寧な回答ありがとうございます。

標準の辞書ではできません。同じキーに複数の値をセットしたいなら値を配列に入れるなど工夫する必要があります。

要件を満たす辞書風のクラスを提供するサードパーティ製のモジュールもあります。 multidict.MultiDictwerkzeug.datastructures.MultiDict を参照してください。

1Like

Comments

  1. @forforfor1760

    Questioner

    教えてくださりありがとうございます。

Your answer might help someone💌