google-code-prettify

星期一, 11月 27, 2017

【Python】字典 (dictionary) 裡面再塞字典,值給 unicode ,字典再放入 list

口白:
流動的水沒有形狀,漂流的風找不到蹤跡,任何案件的 Coding 都取決於心
唯一看透真相的是,外表看似卜朧共,智慧卻低於常人的 名卜朧共 刻爛
(謎之音:把 Code 刻到爛簡稱刻爛.爛..爛...)
Music:
#表升半音 []表高八度
4 3 2 6 4 2 3 #6 6 5 4 5 4 5 6 4 3 2 5 4 3 4 2 6 4 5 [2] [1] #6 6 5 6
4 3 2 6 4 2 3 #6 6 5 4 5 4 5 6 4 3 2 4 3 2 4 2 6 4 5 [2] #6 6 5 6
口白:
刻爛:真実はいつも一つ!

環境:
Python 2.7

狀況:
字典 (dictionary),要產生一個字典小 d ,
內容是以數字當 key index,然後在每個 key 給予 另一個字典
第一個 key 的 value 給數字,第二個key 的 value 給字串
就像是 json 的 物件一樣
{0:{'a':10,'b':'b1'},1:{'a':30,'b':'b2'}}

要如何實做?問問谷哥吧…沒有谷哥罩…我就廢了…

定義 一個字典小 d
d={
 0:
 {
  u'類別':10,
  u'日期':'2017-11-21',
  u'GeometryType':u'Point',
  u'Geometry':['155979.548274', '2554388.51285'],
  u'備註':u'unicode 中文字'
 },
 1:
 {
  u'類別':30,
  u'日期':'2017-11-22',
  u'GeometryType':u'LineString',
  u'Geometry':[['170491.901228', '2541243.38286'], ['170511.894158', '2541243.2872']],
  u'備註':u'unicode english word'
 },
 2:
 {
  '類別':20,
  '日期':'2017-11-21',
  'GeometryType':'Point',
  'Geometry':['155989.548274', '2554388.51285'],
  '備註':'中文字'
 },
 3:
 {
  '類別':40,
  '日期':'2017-11-22',
  'GeometryType':'LineString',
  'Geometry':[['170491.901228', '2541343.38286'], ['170511.894158', '2541343.2872']],
  '備註':'english word'
 }
}

基本上 python 字典 (dictionary) ,看起來就是 json 阿…

>>> print d
{0: {u'Geometry': ['155979.548274', '2554388.51285'], u'\u65e5\u671f': '2017-11-21', u'GeometryType': u'Point', u'\u985e\u5225': 10, u'\u5099\u8a3b': u'unicode \u4e2d\u6587\u5b57'}, 1: {u'Geometry': [['170491.901228', '2541243.38286'], ['170511.894158', '2541243.2872']], u'\u65e5\u671f': '2017-11-22', u'GeometryType': u'LineString', u'\u985e\u5225': 30, u'\u5099\u8a3b': u'unicode english word'}, 2: {'Geometry': ['155989.548274', '2554388.51285'], 'GeometryType': 'Point', '\xe6\x97\xa5\xe6\x9c\x9f': '2017-11-21', '\xe9\xa1\x9e\xe5\x88\xa5': 20, '\xe5\x82\x99\xe8\xa8\xbb': '\xe4\xb8\xad\xe6\x96\x87\xe5\xad\x97'}, 3: {'Geometry': [['170491.901228', '2541343.38286'], ['170511.894158', '2541343.2872']], 'GeometryType': 'LineString', '\xe6\x97\xa5\xe6\x9c\x9f': '2017-11-22', '\xe9\xa1\x9e\xe5\x88\xa5': 40, '\xe5\x82\x99\xe8\xa8\xbb': 'english word'}}
>>> print d[0]
{u'Geometry': ['155979.548274', '2554388.51285'], u'\u65e5\u671f': '2017-11-21', u'GeometryType': u'Point', u'\u985e\u5225': 10, u'\u5099\u8a3b': u'unicode \u4e2d\u6587\u5b57'}
>>> print d[1]
{u'Geometry': [['170491.901228', '2541243.38286'], ['170511.894158', '2541243.2872']], u'\u65e5\u671f': '2017-11-22', u'GeometryType': u'LineString', u'\u985e\u5225': 30, u'\u5099\u8a3b': u'unicode english word'}
>>> print d[2]
{'Geometry': ['155989.548274', '2554388.51285'], 'GeometryType': 'Point', '\xe6\x97\xa5\xe6\x9c\x9f': '2017-11-21', '\xe9\xa1\x9e\xe5\x88\xa5': 20, '\xe5\x82\x99\xe8\xa8\xbb': '\xe4\xb8\xad\xe6\x96\x87\xe5\xad\x97'}
>>> print d[3]
{'Geometry': [['170491.901228', '2541343.38286'], ['170511.894158', '2541343.2872']], 'GeometryType': 'LineString', '\xe6\x97\xa5\xe6\x9c\x9f': '2017-11-22', '\xe9\xa1\x9e\xe5\x88\xa5': 40, '\xe5\x82\x99\xe8\xa8\xbb': 'english word'}

可以看出 key 一開始定義為 unicode 與 依系統預設編碼定義的差異…
看來定義還是一致比較好…這就是為什麼老秦要統一六國,
一國一種語言、方言、貨幣、度量方法…煩都煩死了…
所以大神谷哥阿…我由衷的請求您出一套幹掉各家程式語言的語法…以後我就跟您混…(GO 有機會嗎?)

話說回來…
但…那看不懂的文字要怎麼解決?

這讓我想起古老的人類歷史中,在那個沒有mpeg、巫毒卡的年代,
玩任天堂時,看著鋸齒狀的超級瑪莉…透過大腦內插運算的獲得圓潤化效果…(現在的人類到底是進化?還是退化了!)
或者是根據人腦智慧,看謎片時,自動解碼技術…(現在的人類到底是進化?還是退化了!)
我這兩種都不會阿…更何況是 unicode 編碼、解碼技術…

>>> print repr(d[0]).decode("unicode-escape")
{u'Geometry': ['155979.548274', '2554388.51285'], u'日期': '2017-11-21', u'GeometryType': u'Point', u'類別': 10, u'備註': u'unicode 中文字'}
>>> print repr(d[1]).decode("unicode-escape")
{u'Geometry': [['170491.901228', '2541243.38286'], ['170511.894158', '2541243.2872']], u'日期': '2017-11-22', u'GeometryType': u'LineString', u'類別': 30, u'備註': u'unicode english word'}
>>> print repr(d[2]).decode("unicode-escape")
{'Geometry': ['155989.548274', '2554388.51285'], 'GeometryType': 'Point', '日期': '2017-11-21', '類別': 20, '備註': '中文字'}
>>> print repr(d[3]).decode("unicode-escape")
{'Geometry': [['170491.901228', '2541343.38286'], ['170511.894158', '2541343.2872']], 'GeometryType': 'LineString', '日期': '2017-11-22', '類別': 40, '備註': 'english word'}

可以透過 repr() 定義編碼給它,這樣就可以在 console 中,
看到 字典 (dictionary) unicode 編碼的文字囉(這只是為了在 console 中看的懂而已)

那…要怎麼取 key 的 value 咧…

>>> print d[0][u'備註']
unicode 中文字
>>> print d[1][u'備註']
unicode english word
>>> print d[2]['備註']
中文字
>>> print d[3]['備註']
english word
>>> print d[0]['備註']
Traceback (most recent call last):
  File "", line 1, in 
KeyError: '\xe5\x82\x99\xe8\xa8\xbb'

直接給 key 就可以取得值
不過…當初如果 key 給的是 unicode 就只能用 unicode 的 key(英數則不影響)
不然就會壞掉惹…

另外,不論 key 所存放的 value 是 字典(dictionary)、list、tuple、文字、數字…
取值得方式通通都一樣,直接給 key 就可以取得值
差別在於 list、tuple 取值時,還可以在給予 index 值

所以,跟台式路邊攤大腸包小腸的概念一樣…
大腸灌糯米,再包小腸,小腸又灌豬肉…
這讓我想到,洛哥去面試考警察時,主考官問他為什麼來當差…
洛哥說:為了吃飯…
貪了五億就是為了吃飯阿…我也想…

>>> print d[0]['Geometry']
['155979.548274', '2554388.51285']
>>> print d[0][u'Geometry']
['155979.548274', '2554388.51285']
>>> print d[0]['Geometry'][0]
155979.548274
>>> print d[0]['Geometry'][1]
2554388.51285


上面例子 print d[0]['Geometry']
就是列出 d 字典中 key 為 0 的字典中, key 為 Geometry 的 list

上面例子 print d[0]['Geometry'][0]
就是列出 d 字典中 key 為 0 的字典中, key 為 Geometry 的 list 中,index 為 0 的 值
上面例子 print d[0]['Geometry'][1]
就是列出 d 字典中 key 為 1 的字典中, key 為 Geometry 的 list 中,index 為 1 的 值

編碼設定方式: 設定編碼方式如下
>>> import sys
>>> print 'defaultencoding:', sys.getdefaultencoding()
defaultencoding: ascii
>>> reload(sys)

>>> sys.setdefaultencoding('utf-8')
>>> print 'defaultencoding:', sys.getdefaultencoding()
defaultencoding: utf-8


就算定義了編碼…在 console 中我還是無法用 print 列出字典 (dictionary) 中的中文字…
還是要透過 repr() 來轉

參考文獻:
1. In Python can we add a dictionary inside a dictionary? If yes how can we access the inner dictionary using the key in the primary dictionary?
2.stackoverflow.com:print python dictionary with utf8 values
3.Pythonの日本語処理