Django, Python: çok boyutlu dict PHP-style paranteze POST anahtarlarını dönüştürmek için basit bir yolu var mı?

5 Cevap php

Özellikle, Django hizmeti çağrıları bir form var (Piston kullanılarak yazılmış, ama ben alakalı olduğunu sanmıyorum), böyle bir şey POST aracılığıyla gönderilecek:

edu_type[3][name] => a
edu_type[3][spec] => b
edu_type[3][start_year] => c
edu_type[3][end_year] => d
edu_type[4][0][name] => Cisco
edu_type[4][0][spec] => CCNA
edu_type[4][0][start_year] => 2002
edu_type[4][0][end_year] => 2003
edu_type[4][1][name] => fiju
edu_type[4][1][spec] => briju
edu_type[4][1][start_year] => 1234
edu_type[4][1][end_year] => 5678

Ben böyle bir şey almak için Python ucunda bu işlemek istiyorum:

edu_type = {
    '3' : { 'name' : 'a', 'spec' : 'b', 'start_year' : 'c', end_year : 'd' },
    '4' : {
        '0' : { 'name' : 'Cisco', 'spec' : 'CCNA', 'start_year' : '2002', 'end_year' : '2003' },
        '1' : { 'name' : 'fiju', 'spec' : 'briju', 'start_year' : '1234', 'end_year' : '5678' },
    },
}

Herhangi bir fikir? Teşekkürler!

5 Cevap

Ben çok boyutlu dicts işlemek için Python biraz ayrıştırıcı yapılmış, sen https://github.com/bernii/querystring-parser adresinde bulabilirsiniz

Dottedish ne istediğiniz gibi bir şey yok. http://pypi.python.org/pypi/dottedish. Bu gerçekten bir ana yok ama sen pypi onu yüklemek veya github gelen kaynağını da indirebilirsiniz.

>>> import dottedish
>>> dottedish.unflatten([('3.name', 'a'), ('3.spec', 'b')])
{'3': {'name': 'a', 'spec': 'b'}}

Python bir uzman olmak gibi davranmak istemiyorum, ama PHP sizin için bunu yapmak mümkün olacak json_encode işlevi vardır.

Hızlı bir Google arama json formatına verileri seri için kullanmayı deneyebilirsiniz, hangi this code döndü. (Yanılmıyorsam eğer hangi, ne yayınlanmıştır olduğunu.)

Ben PHP'nin json_encode kullanma hakkında Atlı tarafından önceki yanıt kapalı biniyorum ...

En temel formunda bir Python dict JSON benzemektedir. Kolayca bir Python dicti oluşturmak için bir json yapısı üzerinde bir eval() gerçekleştirebilir:

>>> blob = """{
...     '3' : { 'name' : 'a', 'spec' : 'b', 'start_year' : 'c', 'end_year' : 'd' },
...     '4' : {
...         '0' : { 'name' : 'Cisco', 'spec' : 'CCNA', 'start_year' : '2002', 'end_year' : '2003' },
...         '1' : { 'name' : 'fiju', 'spec' : 'briju', 'start_year' : '1234', 'end_year' : '5678' },
...     },
... }"""
>>> edu_type = eval(blob)
>>> edu_type
{'3': {'end_year': 'd', 'start_year': 'c', 'name': 'a', 'spec': 'b'}, '4': {'1': {'end_year': '5678', 'start_year': '1234', 'name': 'fiju', 'spec': 'briju'}, '0': {'end_year': '2003', 'start_year': '2002', 'name': 'Cisco', 'spec': 'CCNA'}}}

Şimdi, bu en iyi yolu nedir? Muhtemelen değil. Ama çalışıyor ve teknik olarak daha iyi olabilir ki, düzenli ifadeler için çare değildir ama kesinlikle hata ayıklama ve desen eşleştirme giderme harcanan zaman göz önüne alındığında hızlı bir seçenek değildir.

JSON interstisyel veri aktarımı için kullanmak iyi bir biçimdir.

Python da Standart kütüphane parçası olarak bir json modülü vardır. Bu ayrıştırma konum çıkışı hakkında daha seçici olsa da, daha kesinlikle (ilgili daha fazla çalışma ile de olsa) bu konuda gitmek için iyi bir yoldur.

tamam, bu nedenle bu cehennem gibi getto, ama buraya:

senin girdi dizilerini bir listesi diyelim. ki: girdi = [('edu_type [3] [END_YEAR]', 'd'), ...]

from collections import defaultdict
from re import compile

def defdict():
    return defaultdict(defdict)
edu_type = defdict()

inputs = [(x.replace('[', '["').replace(']', '"]'), y) for x, y in input]
for input in inputs:
    exec = '%s = "%s"' % input

Güvenli yaklaşamaz olduğu gibi, sizin giriş kaynağına güveniyorsanız eğer, sadece bu kullanmanız gerektiğini unutmayın.