Dúvida Python - Pegar um dicionário em uma lista

1,221 views
Skip to first unread message

Rogério Carrasqueira

unread,
Dec 16, 2010, 10:26:54 AM12/16/10
to django...@googlegroups.com
Olá Pessoal!

Está dúvida é sobre Python, eu postei no Python-Brasil, mas pode ser que alguém aqui possa dar uma ajuda. (Obrigado!)

Estou precisando de uma pequena ajuda, estou trabalhando com uma aplicação python onde recebo um post de um front-end desenvolvido no Extjs, o problema é que uma das variáveis do Post posta um array que retorna uma lista. Dentro dessa lista eu possuo todo o conjunto de variáveis e valores onde preciso fazer a extração disso. O problema é como converter essa lista em um dicionário de dados. Vejam como está chegando:

[
u'{"discount_value":0,"percent_discount":"0.00","total_item":0,"ends_date":"2010-12-17T00:00:00","inventory":2,"site":"1","commercial_mode":4,"price_cost":"0.00","price_retail":"0.00","price_sale":"0.00","impressions_amount":"0","calc_price":"(price_sale*impressions_amount)/1000","start_date":"2010-12-16T00:00:00"}', u'{"discount_value":0,"percent_discount":"0.00","total_item":0,"ends_date":"2010-12-17T00:00:00","site":"1","inventory":2,"commercial_mode":4,"price_cost":"0.00","price_retail":"0.00","price_sale":"0.00","impressions_amount":"0","calc_price":"(price_sale*impressions_amount)/1000","start_date":"2010-12-16T00:00:00"}'

]

Preciso ter acesso a cada atributo que está aparecendo na lista, por exemplo: preciso pegar o valor de discount_value e por ai vai....

Obrigado pela ajuda!

[]'s


Rogério Carrasqueira

---
e-mail: rogerio.ca...@gmail.com
skype: rgcarrasqueira
MSN: rcarra...@hotmail.com
ICQ: 50525616
Tel.: (11) 7805-0074

gustavo rezende

unread,
Dec 16, 2010, 11:06:00 AM12/16/10
to django...@googlegroups.com
http://infomoz.net/47/

--
Django Brasil em Google Groups <http://groups.google.com.br/group/django-brasil>
Associe-se à Python Brasil e suporte nossa comunidade! <http://associacao.python.org.br/>

Gileno Alves

unread,
Dec 16, 2010, 11:33:38 AM12/16/10
to django...@googlegroups.com
Cara se você recebe isso como um texto, isso está no formato json.
django.utils.simplejson
Ou olhe este link:

--
Django Brasil em Google Groups <http://groups.google.com.br/group/django-brasil>
Associe-se à Python Brasil e suporte nossa comunidade! <http://associacao.python.org.br/>



--
Abraços,
Gileno Filho

Dilan Nery

unread,
Dec 16, 2010, 2:49:04 PM12/16/10
to django...@googlegroups.com
Você pode usar a função eval:

lista = [u'{"discount_value":0,"percent_discount":"0.00","total_item":0,"ends_date":"2010-12-17T00:00:00","inventory":2,"site":"1","commercial_mode":4,"price_cost":"0.00","price_retail":"0.00","price_sale":"0.00","impressions_amount":"0","calc_price":"(price_sale*impressions_amount)/1000","start_date":"2010-12-16T00:00:00"}', u'{"discount_value":0,"percent_discount":"0.00","total_item":0,"ends_date":"2010-12-17T00:00:00","site":"1","inventory":2,"commercial_mode":4,"price_cost":"0.00","price_retail":"0.00","price_sale":"0.00","impressions_amount":"0","calc_price":"(price_sale*impressions_amount)/1000","start_date":"2010-12-16T00:00:00"}']

dicionario = eval(lista[0])

Ou você pode usar o modulo 'simplejson':

import simplejson as json     # importa simplejson e 'apelida' ele de json

dicionario = json.loads(lista)  # retorna um dicionario com os items da lista acima

Das duas formas a melhor é a segunda, a primeira eu não recomendo usar, parece uma gambiarra.

2010/12/16 Gileno Alves <gasc...@gmail.com>



--
Warmest regards,
Dilan Nery - @dilannery - https://github.com/dnerylopes

Dilan Nery

unread,
Dec 16, 2010, 2:52:20 PM12/16/10
to django...@googlegroups.com
desculpem o cross-posting, mas esqueci de mencionar que o metodo loads() do modulo simplejson deve receber um elemento da lista e não a lista toda, então para transformar a lista toda em dicionarios deve usar um loop for.

2010/12/16 Dilan Nery <dnery...@gmail.com>

Rogério Carrasqueira

unread,
Dec 16, 2010, 3:52:43 PM12/16/10
to django...@googlegroups.com
Pessoal,

Consegui, vejam minha implementação

f = request.POST.copy()

saleItens = f.getlist('saleItens') #Aqui eu pego todo a lista que vinha no atributo saleItens do Json
           
for i in saleItens: # faço um for para interagi para cada posição da lista
                   
    saleItem = simplejson.loads(i) # faço o desmembramento em um dicionário
                   
    saleItemData = {
           'site': saleItem['site'] }  #Agora consigo ler atributo por atributo.

Muito obrigado!

Um grande abraço!


Rogério Carrasqueira

---
e-mail: rogerio.ca...@gmail.com
skype: rgcarrasqueira
MSN: rcarra...@hotmail.com
ICQ: 50525616
Tel.: (11) 7805-0074



Gileno Alves

unread,
Dec 16, 2010, 8:02:19 PM12/16/10
to django...@googlegroups.com
Dilan, o método loads() pode receber sim uma lista, ai no caso irá retornar uma lista de dicionários.

2010/12/16 Dilan Nery <dnery...@gmail.com>

Gileno Alves

unread,
Dec 16, 2010, 8:02:58 PM12/16/10
to django...@googlegroups.com
Uma lista no formato de string logicamente....

2010/12/16 Gileno Alves <gasc...@gmail.com>

Dilan Nery

unread,
Dec 16, 2010, 8:18:21 PM12/16/10
to django...@googlegroups.com
Gileno,

Na documentação diz que o metodo .loads() só recebe 'str' ou um 'unicode', não recebe uma lista. Testei no interpretador passando uma lista como argumento e o erro levantado foi: TypeError: expected string or buffer reafirmando o que diz na documentação.


2010/12/16 Gileno Alves <gasc...@gmail.com>

Gileno Alves

unread,
Dec 17, 2010, 12:17:18 PM12/17/10
to django...@googlegroups.com
É como eu disse anteriormente:
"Uma lista no formato de string logicamente...."

No exemplo a string informada (se for uma string) está no formato json e passada para o loads retorna uma lista (com apenas um elemento) de dicts.

2010/12/16 Dilan Nery <dnery...@gmail.com>

Dilan Nery

unread,
Dec 17, 2010, 12:29:33 PM12/17/10
to django...@googlegroups.com
Não estou conseguindo entender quando diz: Uma lista no formato de string. Seria:

lista = "[u'{"discount_value":0,"percent_discount":"0.00","total_item":0,"ends_date":"2010-12-17T00:00:00","inventory":2,"site":"1","commercial_mode":4,"price_cost":"0.00","price_retail":"0.00","price_sale":"0.00","impressions_amount":"0","calc_price":"(price_sale*impressions_amount)/1000","start_date":"2010-12-16T00:00:00"}', u'{"discount_value":0,"percent_discount":"0.00","total_item":0,"ends_date":"2010-12-17T00:00:00","site":"1","inventory":2,"commercial_mode":4,"price_cost":"0.00","price_retail":"0.00","price_sale":"0.00","impressions_amount":"0","calc_price":"(price_sale*impressions_amount)/1000","start_date":"2010-12-16T00:00:00"}']"

Se for assim, o metodo loads() tambem não aceita, ele só aceita strings e unicodes;

No exemplo a string informada (se for uma string) está no formato json e passada para o loads retorna uma lista (com apenas um elemento) de dicts.

Ele retorna um dict e não uma lista de dicts

2010/12/17 Gileno Alves <gasc...@gmail.com>

Gileno Alves

unread,
Dec 17, 2010, 12:54:10 PM12/17/10
to django...@googlegroups.com
É o seguinte:
"""
[{'key1' : 'value1', 'key2': 'value2'}, {'key1' : 'value1', 'key2': 'value2'}, {'key1' : 'value1', 'key2': 'value2'}]
"""
Essa string acima está no formato json e é uma lista.
O exemplo mais fácil de você enteder é criar uma lista e jogá-la para o método dumps do simplejson você verá a lista em formato de string (json)

2010/12/17 Dilan Nery <dnery...@gmail.com>

Erle Carrara

unread,
Dec 17, 2010, 1:27:29 PM12/17/10
to django...@googlegroups.com
JSON é um formato para guardar informações em modo legível. Se parece muito com as listas de dicionários do Python.

Você está recendo uma string seguindo o padrão json, e não um object list do python com objeto dict dentro.

http://json.org/

:)


- - -
Erle Carrara
<carrar...@gmail.com>

Dilan Nery

unread,
Dec 17, 2010, 5:28:25 PM12/17/10
to django...@googlegroups.com
Gileno,

Agora entendi o que estava falando, antes eu tentei só colocar aspas no começo da lista o que obviamente não iria funcionar. Então para você passar um lista no formato de string para o método loads, primeiro tem que serializar usando .dumps() ou construir uma string já serializada (que dá mais trabalho é melhor usar .dumps() mesmo.)

Não sabia disso, sempre que tinha uma lista com strings no formato json eu construía um loop, obrigado pela dica Gileno.

2010/12/17 Erle Carrara <carrar...@gmail.com>
Reply all
Reply to author
Forward
0 new messages