Уведомления

Группа в Telegram: @pythonsu

#1 Март 31, 2011 16:26:32

Panter7777
От:
Зарегистрирован: 2011-02-16
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться со словарями

Получилось самому разобраться:
Кому интерестно

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']}



Офлайн

#2 Апрель 1, 2011 03:15:51

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Помогите разобраться со словарями

можно немного по извращаться:

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



Офлайн

#3 Апрель 1, 2011 09:38:10

Panter7777
От:
Зарегистрирован: 2011-02-16
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться со словарями

Ого с библиотеками…сильно. Большое спасибо!
Но я забыл маленькую деталь, что нужно получить вид не:

{1: ['11', '99a'], 2: ['22'], 3: ['33', '33`2a']}
А нужен такой вид:
{1: ('11', '99a'), 2: '22', 3: ('33', '33`2a')}
и это принципиальный момент!



Отредактировано (Апрель 1, 2011 09:47:43)

Офлайн

#4 Апрель 1, 2011 10:43:51

Panter7777
От:
Зарегистрирован: 2011-02-16
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться со словарями

Собственно чтобы добится такого вида пришлось читерить с помощью 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')}
Собственно чего и добивался!



Офлайн

#5 Апрель 1, 2011 11:11:23

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Помогите разобраться со словарями

>>> 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')}
>>>



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version