terasima712
@terasima712 (ゆき 寺島)

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!

{tuple:int}の辞書を作りたいが、TypeErrorが出る

解決したいこと

A,B,C,DをGUの商品とし、その組み合わせの共起回数をカウントするプログラムを書いています。
item_pairs_listには、1つのコーディネート内で出現したアイテムの総当たりペアのtupleが格納されています。
(1つのコーディネートなので共起回数はすべて1なので当たり前と思われるかもしれませんが、これを他のコーディネートでも繰り返すことで、多くのコーディネートで最も共起しているペアを知りたいためです)

item_pairs_list = [(A,B),(A,C),(A,D),(B,C),(B,D),(C,D)]

具体的にAやBは,
A=
{'imgurl': 'https://image.uniqlo.com/GU/ST3/jp/imagesgoods/340538/item/jpgoods_09_340538.jpg?width=149&height=149',
'title': 'マルチウェイワンピース(半袖)Q',
'color': '09 BLACK'}
B={'imgurl': 'https://image.uniqlo.com/GU/ST3/jp/imagesgoods/338664/item/jpgoods_01_338664.jpg?width=149&height=149',
'title': 'リネンブレンドオーバーサイズハーフスリーブジャケット',
'color': '01 OFF WHITE'}
のように辞書です。

int=共起回数として、

edge_table={(A,B):1, (A,C):1...}
のような辞書を作りたいです。

具体的には(要素は一つですが)このような形です。
edge_table=
{({'imgurl': 'https://image.uniqlo.com/GU/ST3/jp/imagesgoods/340538/item/jpgoods_09_340538.jpg?width=149&height=149',
'title': 'マルチウェイワンピース(半袖)Q',
'color': '09 BLACK'},
{'imgurl': 'https://image.uniqlo.com/GU/ST3/jp/imagesgoods/338664/item/jpgoods_01_338664.jpg?width=149&height=149',
'title': 'リネンブレンドオーバーサイズハーフスリーブジャケット',
'color': '01 OFF WHITE'})
:
1
}

しかし、TypeErrorが出てしまいます。
タプルはキーにとれないのでしょうか?
よろしくお願いします。

発生している問題・エラー

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-14-bc6974d0f421> in <module>()
     11     edge_table[item_pairs] = edge_table[item_pairs]+1
     12   else:
---> 13     edge_table[item_pairs] = 1
     14 
     15     

TypeError: unhashable type: 'dict'

該当するソースコード

for item_pairs in item_pairs_list:
  print(item_pairs)

#以下print出力
#    ({'imgurl': 'https://image.uniqlo.com/GU/ST3/jp/imagesgoods/340538/item/jpgoods_09_340538.jpg?width=149&height=149',
#    'title': 'マルチウェイワンピース(半袖)Q', 
#    'color': '09 BLACK'},
#    {'imgurl': 'https://image.uniqlo.com/GU/ST3/jp/imagesgoods/338664/item/jpgoods_01_338664.jpg?width=149&height=149', 
#     'title': 'リネンブレンドオーバーサイズハーフスリーブジャケット', 
#     'color': '01 OFF WHITE'})

  if item_pairs in list(edge_table.keys()):
    edge_table[item_pairs] = edge_table[item_pairs]+1
  else:
    edge_table[item_pairs] = 1 
0

2Answer

tupleの中にdictが入っていなければ、{tuple:int} は使えます。内部でhashを使うので、変化するようなもはだめなのようです。以下のようにすれば使えました

item_pairs_list = [
 ('マルチウェイワンピース(半袖)Q', 'リネンブレンドオーバーサイズハーフスリーブジャケット'),
 ('マルチウェイワンピース(半袖)Q', 'dummy 1'),
 ('マルチウェイワンピース(半袖)Q', 'dummy 2'),
 ('マルチウェイワンピース(半袖)Q', 'リネンブレンドオーバーサイズハーフスリーブジャケット'),
]
edge_table = {}

for item_pairs in item_pairs_list:
  print(item_pairs)

  if item_pairs in list(edge_table.keys()):
    edge_table[item_pairs] = edge_table[item_pairs] + 1
  else:
    edge_table[item_pairs] = 1

print(edge_table)
# {('マルチウェイワンピース(半袖)Q', 'リネンブレンドオーバーサイズハーフスリーブジャケット'): 2, ('マルチウェイワンピース(半袖)Q', 'dummy 1'): 1, ('マルチウェイワンピース(半袖)Q', 'dummy 2'): 1}
1Like

Comments

  1. @terasima712

    Questioner

    ありがとうございます!

エラーの通り、dict型はキーにできません。
strやintのタプルならばキーにできます。

0Like

Your answer might help someone💌