Уведомления

Группа в Telegram: @pythonsu

#1 Март 2, 2015 22:15:24

prizrak-pro
Зарегистрирован: 2013-10-09
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Списки и словари создание на лету

Может тема странная, но постараюсь объяснить.

Как можно такое сделать, без проверок, если это возможно на python.

Приведу пример на PHP.
Например нам нужно составить вложенный ассоциативный массив.

$id_p = ‘r’
$raa=1
$raa=2
$id_p = ‘s’
$raa=1
В итоге получим массив.
raa=1
raa=2
raa=1
Как так же, на ходу создать список в Python.

Просто получается его нужно объявить.
raa={}
id_p = ‘r’
raa
И далее мне нужно создать список.
raa=
А потом делать raa.append(1)
raa.append(2)
И если это в цикле, я же не могу постоянно создавать список, мне нужно проверять есть ли список или нет. Я правильно понимаю? Или есть иной способ?

Офлайн

#2 Март 2, 2015 22:30:38

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Списки и словари создание на лету

оформляйте код в теги code, иначе скобки съедаются и код нечитаемый. Пока что мало понятно о чем именно идет речь.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Март 3, 2015 23:07:15

prizrak-pro
Зарегистрирован: 2013-10-09
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Списки и словари создание на лету

есть список полученный из базы

BD = [(12,'text',1),(13,'text',0),(12,'text',2),(13,'text1',1),(14,'text1',2)]

Мне нужно получить из него словарь вида.

u[12]['bd']=[(12,'text',1),(12,'text',2)]
u[12]['con']=3
u[13]['bd']=[(13,'text',0),(13,'text',1)]
u[13]['con']=1
u[14]['bd']=[(14,'text',1)]
u[13]['con']=2

Я могу задать
u={}
А вот как потом делать

Если в цикле мы перебираем список DB. Нужно что типа
u[12]['bd'].append()
Но нужно определить есть ли список
u[12]['bd']

Я ввел проверку.
if not id in u:
	u[id] = {'bd':[],'con':0}

(id получаем при переборе списка)

Правильно или есть другой подход.

Офлайн

#4 Март 3, 2015 23:56:41

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Списки и словари создание на лету

>>> def f(seq):
...     d = {}
...     for i in seq:
...         n = i[0]
...         if n not in d:
...             d[n] = {'db': [], 'con': 0}
...         d[n]['db'].append(i)
...         d[n]['con'] = 1
...     return d
... 
>>> lst = [(12, 'text', 1),
...        (13, 'text', 0),
...        (12, 'text', 2),
...        (13, 'text1', 1),
...        (14, 'text1', 2)]
>>> 
>>> f(lst)
{12: {'con': 1, 'db': [(12, 'text', 1), (12, 'text', 2)]}, 13: {'con': 1, 'db': [(13, 'text', 0), (13, 'text1', 1)]}, 14: {'con': 1, 'db': [(14, 'text1', 2)]}}
>>>



Офлайн

#5 Март 4, 2015 06:12:16

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

Списки и словари создание на лету

BD = [(12,'text',1),(13,'text',0),(12,'text',2),(13,'text1',1),(14,'text1',2)]
result = {}
for rec in BD:
    r = result.setdefault(rec[0], {'db': [], 'con': 0})
    r['db'].append(rec)
    r['con'] += rec[2]
print(result)



Отредактировано pyuser (Март 4, 2015 06:13:45)

Офлайн

#6 Март 4, 2015 10:53:55

prizrak-pro
Зарегистрирован: 2013-10-09
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Списки и словари создание на лету

Большое спасибо за ответы.
Про setdefault не знал, буду иметь в виду.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version