2014-10-11 104 views
1

如何將列表的列表轉換爲我可以爲每個對象調用的類,如foo.bar.spam如何將列表轉換爲Flask模板的類對象

列出的清單:

information =[['BlueLake1','MO','North','98812'], ['BlueLake2','TX','West','65343'], ['BlueLake3','NY','sales','87645'],['RedLake1','NY','sales','58923'],['RedLake2','NY','sales','12644'],['RedLake3','KY','sales','32642']]

這將是使用Jinja2的模板在瓶一個非常大的HTML表格創建變量。

我希望能夠做這樣的事情:

{% for x in information %} 
    <tr> 
     <td>{{x.name}}</td> 
     <td>Via: {{x.location}} | Loop: {{x.region}}</td> 
     <td>{{x.idcode}}</td> 
    </tr> 
{% endfor %} 

將會有其他用途則僅此一個信息模板,因此爲什麼我希望它是一個可調用的類中使用在其他地方。

回答

3

使用collections.namedtuple

>>> from collections import namedtuple 
>>> Info = namedtuple('Info', ['name', 'location', 'region', 'idcode']) 
>>> 
>>> information =[ 
...  ['BlueLake1','MO','North','98812'], 
...  ['BlueLake2','TX','West','65343'], 
...  ['BlueLake3','NY','sales','87645'], 
...  ['RedLake1','NY','sales','58923'], 
...  ['RedLake2','NY','sales','12644'], 
...  ['RedLake3','KY','sales','32642'] 
... ] 
>>> [Info(*x) for x in information] 
[Info(name='BlueLake1', location='MO', region='North', idcode='98812'), 
Info(name='BlueLake2', location='TX', region='West', idcode='65343'), 
Info(name='BlueLake3', location='NY', region='sales', idcode='87645'), 
Info(name='RedLake1', location='NY', region='sales', idcode='58923'), 
Info(name='RedLake2', location='NY', region='sales', idcode='12644'), 
Info(name='RedLake3', location='KY', region='sales', idcode='32642')] 
+0

使用namedtuples在這種情況下,一個很好的快捷方式。喜歡它。 – 2014-10-11 03:29:13

+0

好吧,然後我怎麼會得到這個能夠在信息中爲x輸入info = [Info(* x)]':info:print x.name'?我試了這個,它只是打印出'<屬性對象在0x02592480>' – BilliAm 2014-10-11 04:11:03

+1

@BilliAm,我不明白你的意思。看到這個:http://asciinema.org/a/12893 – falsetru 2014-10-11 04:39:55

1

可能是最常見的方式是把每個記錄成一個字典

info = [] 
for r in information: 
    record = dict(name=r[0], location=r[1], region=r[2], idcode=r[3]) 
    info.append(record) 

的Jinja2然後允許你使用x.name等來訪問屬性就像你在你的例子中一樣。

{% for x in info %} 
    <tr> 
     <td>{{x.name}}</td> 
     <td>Via: {{x.location}} | Loop: {{x.region}}</td> 
     <td>{{x.idcode}}</td> 
    </tr> 
{% endfor %} 

注意索引到的數據(x.name)的這種方式是Jinja2的特定的快捷方式(儘管它是從Django模板,這可能是偷來的東西他人竊取)。

在Python本身你必須做的:

for x in info: 
    print(x['name']) 
    # x.name will throw an error since name isn't an 'attribute' within x 
    # x['name'] works because 'name' is a 'key' that we added to the dict 
+0

那麼,我將如何訪問每個字典項目,如x.name?我嘗試了這一點,然後'在信息:打印x.name'的X和我得到''字典'對象沒有屬性'名稱'我仍然沒有看到我怎麼到達那裏。 – BilliAm 2014-10-11 04:09:21

+1

的確,這是jinja2添加的一個捷徑,可以讓您更輕鬆地訪問模板中字典的內容。我會爲你添加細節。由於聽起來這是不熟悉的地形(字典是該語言的核心構建塊),我強烈建議您閱讀一些文檔以瞭解如何使用它們 - https://docs.python.org/2 /tutorial/datastructures.html#dictionaries - 實際上,我強烈建議瀏覽整個頁面。這是在Python中存儲數據的常見方式的一個很好的概述。 – 2014-10-11 09:26:12

+0

太棒了!那就是我正在尋找的東西。 – BilliAm 2014-10-11 16:25:56