2012-06-05 2 views
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} 
+2

Вы хотите наборы быть ключами, или вы хотите строковое представление множества быть ключ? – Trevor

+0

Строка представляет собой ключ. – ThinkCode

ответ

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 
2

Я не думаю, что вы можете иметь set в качестве словаря ключ, так, может быть, кортеж?

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 
+2

Вы можете, если используете frozenset – jamylak

+1

@jamylak, frozenset наверняка как 'sets' неупорядочены –

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]} 
+1

Это тоже работает! Спасибо. – ThinkCode

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']}) 
Смежные вопросы