2

私はこのデータセットを持っています。MySQLテーブルを更新したい。現在の形式で実行できますが、辞書に変換すると、更新されるリストが縮小されると思いました。

私のデータセット:

dataset = [('121', set(['NY'])), ('132', set(['CA', 'NY'])), ('198', set(['NY'])), ('676', set(['NY'])), ('89', set(['NY', 'CA']))]

必要な出力:

辞書 :

output = {'set(['NY'])':121,198,676, 'set(['CA', 'NY'])':132,89}
4

4 に答える 4

5

キーにはfrozensetを使用する必要があります。同じ要素を持つセットが常に同じになる、reprまたはtupleセットが順序付けされていないという保証はありません。もちろん、最初にセット要素を並べ替えない限り、それは無駄に思えます

from collections import defaultdict

dataset = [('121', set(['NY'])), ('132', set(['CA', 'NY'])), ('198', set(['NY'])), ('676', set(['NY'])), ('89', set(['NY', 'CA']))]
output = defaultdict(list)
for value, key in dataset:
    output[frozenset(key)].append(value)

またはソートされたタプルを使用する

from collections import defaultdict

dataset = [('121', set(['NY'])), ('132', set(['CA', 'NY'])), ('198', set(['NY'])), ('676', set(['NY'])), ('89', set(['NY', 'CA']))]
output = defaultdict(list)
for value, key in dataset:
    output[tuple(sorted(key))].append(value)

これを説明するためのランダムな例

>>> s,t = set([736, 9753, 7126, 7907, 3350]), set([3350, 7907, 7126, 9753, 736])
>>> s == t
True
>>> tuple(s) == tuple(t)
False
>>> frozenset(s) == frozenset(t)
True
>>> hash(tuple(s)) == hash(tuple(t))
False
>>> hash(frozenset(s)) == hash(frozenset(t))
True
于 2012-06-05T22:41:38.287 に答える
2

set辞書キーとしてaを使用できるとは思わないので、タプルでしょうか。

from collections import defaultdict

dataset = [('121', set(['NY'])), ('132', set(['CA', 'NY'])), ('198', set(['NY'])), ('676', set(['NY'])), ('89', set(['NY', 'CA']))]
output = defaultdict(list)
for value, key in dataset:
    output[tuple(key)].append(value)
    # or output[str(key)].append(value) if you want a string as the key
于 2012-06-05T22:20:33.247 に答える
1

これを試して:

dataset = [('121', set(['NY'])), ('132', set(['CA', 'NY'])), ('198', set(['NY'])), ('676', set(['NY'])), ('89', set(['NY', 'CA']))]
from collections import defaultdict
d = defaultdict(list)

for val, key in dataset:
    d[repr(key)].append(int(val))

d
> {"set(['NY', 'CA'])": [132, 89], "set(['NY'])": [121, 198, 676]}
于 2012-06-05T22:22:55.340 に答える
1

これに代わるものがありdefaultdictます:

dataset = [('121', set(['NY'])), ('132', set(['CA', 'NY'])), ('198', set(['NY'])), ('676', set(['NY'])), ('89', set(['NY', 'CA']))]    

output = {}
for value, key in dataset:
   output.setdefault(frozenset(key), []).append(value)

結果:

>>> output
{frozenset(['NY', 'CA']): ['132', '89'], frozenset(['NY']): ['121', '198', '676']}

次の動作のため、ここで使用setdefault()することをお勧めします。defaultdict

>>> output = defaultdict(list, {frozenset(['NY', 'CA']): ['132', '89'], frozenset(['NY']): ['121', '198', '676']})
>>> output[frozenset(['FL'])]    # instead of a key error, this modifies output
[]
>>> output
defaultdict(<type 'list'>, {frozenset(['NY', 'CA']): ['132', '89'], frozenset(['FL']): [], frozenset(['NY']): ['121', '198', '676']})
于 2012-06-05T23:08:38.587 に答える