[問題] list增加維度(已解決)

作者: st1009 (前端攻城師)   2018-06-04 20:54:28
不才小萌新想要請教各位前輩大大 list 如何增加維度<(_ _)>
我現在有個二維串列和一個一維串列
示例:
demo
[0]['A','B','C']
[1]['D','E','E']
addA
['A1','A2','A3']
我嘗試demo[0][0].append(addA)
我希望的效果是demo[0][0][0]會印出A1
但是失敗了 錯誤訊息是:
TypeError: 'str' object does not support item assignment
我判斷demo[0][0]抓到的是字串A而不是該陣列,所以不能append
那麼請問各位大大我如何在A後面增加一維變成類似樹狀結構的構造?
作者: djshen (djshen)   2018-06-04 20:56:00
加進去之後原本的A怎麼辦?
作者: gmccntzx1 (o.O)   2018-06-04 20:59:00
1. 先了解append()的作用,新的元素是放在最後面2. demo[0][0]就是'a', 但你是要把addA加到demo[0]才對3. 去查一下list.insert()怎麼用吧補充: 根據你回文要的功能,建議你重新了解list結構ˇ如果是想把A當作選到整個['A1', 'A2', 'A3']時的回傳值,你可以寫一個新的class配上dict和__getitem__去處理(繼承list)譬如說,在__getitem__()裡判斷目前取得的元素是否為dict,是的話回傳該dict的key. 但是這邊要注意到,dict是可擴充的,所以若該dict有複數個key,那這種方法又會失效有需要討論的話,可以站內信給我,我們用discord講比較快
作者: djshen (djshen)   2018-06-04 21:58:00
linked list用index access?
作者: gmccntzx1 (o.O)   2018-06-04 22:37:00
https://repl.it/repls/GrimAdorableDeskscan這樣的效果是你要的嗎?簡單來說,建立一個繼承list的class. 裡面多一個屬性`name`作為該list的名稱. 然後你要的效果就從__repr__去處理.補充說明一下: 我之所以會說用discord討論是因為那個註冊一下就可以用了,而且又不會透露你實際上是誰https://codeshare.io 好像也是可以,只是它好像沒有單純的voice chat
作者: flarehunter (Range)   2018-06-04 22:59:00
d=[['a','b'],['c','d']]d[0][0] = ['A1', 'A2', d[0][0]]你是想做這種事嗎?
作者: gmccntzx1 (o.O)   2018-06-04 23:00:00
回覆關於你說的要產生第3個維度: 我的範例4中, nl原本是1維,照你想要的效果來看,就是將其中一個元素重新指派為一個NamedList(也就是說該元素的維度增加).ok. 只是看完你的code,感覺你寫一個class去整理會更清楚喔!
作者: flarehunter (Range)   2018-06-04 23:12:00
恩看不太懂你的demo要長怎樣才會符合你的需求
作者: gmccntzx1 (o.O)   2018-06-04 23:17:00
我的意思是把你要從db抓出的東西包成一個class目前看來,你應該是想要抓出word,然後再根據word抓出其他東西.
作者: djshen (djshen)   2018-06-04 23:26:00
我很好奇你之前怎麼用linked listc++寫linked list你有像這篇一樣用demo[0][0]拿資料?
作者: gmccntzx1 (o.O)   2018-06-04 23:46:00
https://repl.it/repls/PoorStupidDisassembler新增一個Class MyData,用這個去存你要的資料. 這樣至少比一直用list[m][n][o]去抓資料容易懂其他你寫的東西我有稍微修改,不過整體沒有動到.等你確定做出要的功能後,再自己把code整理一下吧重貼 http://codepad.org/rTnBeOrz (上面的沒存成功)了解. 那剩下的你再試試看囉記得你的那個叫做list的method最好改一下名稱.我的46行寫錯,左值應該要改成category[i]等等...我搞錯了. 那行不用改G_G因為那邊本來就是要把category[i][j]這個word換成MyData. 暈了我...別想的太複雜.1. __init__()就是物件的建構式,我在裡面加上word這個欄位,方便之後底下的__repr__去處理你要的功能.2. __repr__()是回傳物件的表示,像是print(object)時,就會去呼叫物件的__repr__()__init__()裡面,第一行是取出kwargs中為word的值kwargs是一個dict,所以如果kwargs裡沒有key為word的值的話,就會回傳None.第二行super(...).__init__(...)則是呼叫父類別(list)的建構式__init__().self[:] ← 因為MyData是list,所以self[:]就是取出list內的所有元素.後面的if else就相當於C的三元運算子再稍微修改後的結果: http://codepad.org/QcD1aN0Z關於*args和**kwargs,看一下這個連結的說明https://stackoverflow.com/questions/3394835args和kwargs只是變數名稱,不一定非要用這幾個字然後在class裡面self這個關鍵字是指`物件自己`不過正確說,`self`是大家常用的詞,不算是keywordok的! 有問題就再更新內容吧那算是coding style (詳見PEP8),就跟class method的第一個參數常用cls或clz一樣ok 加油囉y突然想到,44行 mydata = getData(link, mydata.word)要改成1. mydata.append(getData(link, mydata.word))寫錯,1. mydata.extend(getData(link, mydata.word))或2. mydata[:] = getData(link, mydata.word)
作者: st1009 (前端攻城師)   2018-06-05 08:17:00
感謝您,昨晚就想說怎沒存起來,想今晚問XDD
作者: flarehunter (Range)   2018-06-05 13:03:00
感覺你的需求用dict就可以了吧[{'A': [A1, A2, A3], 'B': ..}, ...]
作者: pzyc79   2018-06-05 17:58:00
demo[0][0] = {demo[0][0]: addA} print(demo[0][0]['A'])

Links booklink

Contact Us: admin [ a t ] ucptt.com