Найти - Пользователи
Полная версия: Помогите разобраться со словарями
Начало » Python для новичков » Помогите разобраться со словарями
1 2
Panter7777
Получилось самому разобраться:
Кому интерестно
test = [{'inf':1, 'numb':'11'},{'inf':1, 'numb':'99a'},{'inf':2, 'numb':'22'},{'inf':3, 'numb':'33'},{'inf':3, 'numb':'33`2a'},]
cu = {}
for i in test:
if not cu.has_key(i['inf']):
cu[i['inf']] = []
cu[i['inf']].append(i['numb'])
else:
cu[i['inf']].append(i['numb'])
Результат:
{1: ['11', '99a'], 2: ['22'], 3: ['33', '33`2a']}
pyuser
можно немного по извращаться:
from itertools import groupby
from operator import itemgetter

def foo():
test = [{'inf':1, 'numb':'11'}, {'inf':1, 'numb':'99a'},
{'inf':2, 'numb':'22'}, {'inf':3, 'numb':'33'},
{'inf':3, 'numb':'33`2a'},
]
test.sort(key=itemgetter("inf")) # если заранее известно, что test отсортирован по "inf", то можно не делать
result = dict((k, [x["numb"] for x in g]) \
for k, g in groupby(test, key=itemgetter("inf")))
return result
либо Ваш же вариант, но более читаемо:
from collections import defaultdict

def foo():
test = [{'inf':1, 'numb':'11'}, {'inf':1, 'numb':'99a'},
{'inf':2, 'numb':'22'}, {'inf':3, 'numb':'33'},
{'inf':3, 'numb':'33`2a'},
]
result = defaultdict(list)
for i in test:
result[i["inf"]].append(i["numb"])
return result
Panter7777
Ого с библиотеками…сильно. Большое спасибо!
Но я забыл маленькую деталь, что нужно получить вид не:
{1: ['11', '99a'], 2: ['22'], 3: ['33', '33`2a']}
А нужен такой вид:
{1: ('11', '99a'), 2: '22', 3: ('33', '33`2a')}
и это принципиальный момент!
Panter7777
Собственно чтобы добится такого вида пришлось читерить с помощью JavaScripta^
То есть в {streets}- все ключи, {doma}- все значения:
из списка такого вида:
street_number = {1: ['11', '99a'], 2: ['22'], 3: ['33', '33`2a']}

for v,k in street_number.items():
if street_number.has_key(v):
tpl.set_var("streets", v) #Это парсинг в переменную, самописный
sts=""
for z in k:
if sts:
sts += ",'%s'" % z
else:
sts += "'%s'" % z
tpl.set_var("doma", sts)

var streets=new Array();
streets[{streets}] = new Array({doma});
И на выходе, вуаля:
streets[1]: ('11', '99a'), 
streets[2]:( '22'),
streets[3]: ('33', '33`2a')}
Собственно чего и добивался!
sp3
>>> d = {1: ['11', '99a'], 2: ['22'], 3: ['33', '33`2a']}
>>> for i in d: d[i] = tuple(d[i])
...
>>> d
{1: ('11', '99a'), 2: ('22',), 3: ('33', '33`2a')}
>>>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB