看板 Python 關於我們 聯絡資訊
不才小萌新想要請教各位前輩大大 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後面增加一維變成類似樹狀結構的構造? -- 壁河山攻守 爭成敗悟道 許銀川 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.163.158.239 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1528116871.A.63F.html
djshen: 加進去之後原本的A怎麼辦? 06/04 20:56
如果可以,我希望demo[0][0]跑出A,demo[0][0][0]跑出A的資訊A1 >///<
gmccntzx1: 1. 先了解append()的作用,新的元素是放在最後面 06/04 20:59
好的
gmccntzx1: 2. demo[0][0]就是'a', 但你是要把addA加到demo[0]才對 06/04 21:00
gmccntzx1: 3. 去查一下list.insert()怎麼用吧 06/04 21:02
我粗略嘗試之後效果似乎不太對
gmccntzx1: 補充: 根據你回文要的功能,建議你重新了解list結構ˇ 06/04 21:04
我原本以為list就是練結串列,所以應該可以直接實現我要的結構, 不過仔細研究之後好像不行 我可能接下來會嘗試用demo[0][0]的A當作dict的索引,再連到addA拿資訊吧, 謝謝您的回覆<(_ _)>
gmccntzx1: 如果是想把A當作選到整個['A1', 'A2', 'A3']時的回傳值 06/04 21:22
gmccntzx1: ,你可以寫一個新的class配上dict和__getitem__去處理 06/04 21:24
gmccntzx1: (繼承list) 06/04 21:24
gmccntzx1: 譬如說,在__getitem__()裡判斷目前取得的元素是否為 06/04 21:27
gmccntzx1: dict,是的話回傳該dict的key. 但是這邊要注意到,dict是 06/04 21:28
gmccntzx1: 可擴充的,所以若該dict有複數個key,那這種方法又會失效 06/04 21:29
gmccntzx1: 有需要討論的話,可以站內信給我,我們用discord講比較快 06/04 21:30
我窩窩對python的了解不深,不太清楚__getitem__這樣高級用法,感覺您的方法好複雜 小萌新怕怕(抖抖 我現在正在研究python有沒有可能自己寫link list, 有了這個,我想要的資料結構應該都可以自己實作 discord就算了吧,您的方法對我太高深,而且我沒用discord 謝謝您 <3 太喜歡鏈結串列了,忽然覺得沒指標的語言不是很好處理資料結構Q
djshen: linked list用index access? 06/04 21:58
我研究看看,不過我可能會考慮看看有沒有簡單的方法解我真正的問題,快昏了
gmccntzx1: https://repl.it/repls/GrimAdorableDeskscan 06/04 22:37
gmccntzx1: 這樣的效果是你要的嗎? 06/04 22:37
gmccntzx1: 簡單來說,建立一個繼承list的class. 裡面多一個屬性 06/04 22:39
gmccntzx1: `name`作為該list的名稱. 然後你要的效果就從__repr__ 06/04 22:40
gmccntzx1: 去處理. 06/04 22:41
gmccntzx1: 補充說明一下: 我之所以會說用discord討論是因為那個 06/04 22:49
gmccntzx1: 註冊一下就可以用了,而且又不會透露你實際上是誰 06/04 22:49
http://codepad.org/Kycszfma 上面是我原始的code,我要產生要求效果的地方是第32行 我仔細研究之後,您給的這份code應該可以完成我的要求 非常感謝您!m(_ _)m
gmccntzx1: https://codeshare.io 好像也是可以,只是它好像沒有單 06/04 22:52
gmccntzx1: 純的voice chat 06/04 22:52
謝謝您提供的溝通知識 <3 其實我的問題再來一個dict應該可以解,不過我再邊處理其他事>"<
flarehunter: d=[['a','b'],['c','d']] 06/04 22:59
flarehunter: d[0][0] = ['A1', 'A2', d[0][0]] 06/04 22:59
flarehunter: 你是想做這種事嗎? 06/04 22:59
不是,我是希望demo[0][0]跑出A,demo[0][0][0]跑出A的資訊A1 >"<
gmccntzx1: 回覆關於你說的要產生第3個維度: 我的範例4中, nl原本 06/04 23:00
gmccntzx1: 是1維,照你想要的效果來看,就是將其中一個元素重新指派 06/04 23:00
gmccntzx1: 為一個NamedList(也就是說該元素的維度增加). 06/04 23:01
其實我剛剛又研究了一下,我發現範例3應該可以實現我要的, 只是我前面要自己加一維的樣子,感謝您<(_ _)>
gmccntzx1: ok. 只是看完你的code,感覺你寫一個class去整理會更清 06/04 23:08
gmccntzx1: 楚喔! 06/04 23:08
嗯,謝謝,程式能力不佳,努力切成2個fn了,之間還有互相引用, 不是很確定除了整個包起來之外的class寫法,我學py真的不多,不是很熟class的使用 如果把那兩個直接包起來,或各包一個,感覺就沒有class的好處了....
flarehunter: 恩看不太懂你的demo要長怎樣才會符合你的需求 06/04 23:12
其實是我需求太怪了...長不太出來QAQ 不過gmccntzx1提供的程式其實算是可以實現我的想法, 他的範例3,我可以由nl[0]得到我的頭是否是我要的頭,是,我再去取後面的資料 用nl[0][0]取資料 畫成圖像是 索引 資料 A 1 2 3 B 4 5 6 C 7 8 9
gmccntzx1: 我的意思是把你要從db抓出的東西包成一個class 06/04 23:17
我的dbtool太多引用了,暫時都會維持程序導向,不會改物件導向以保持一致 如果不是說這個...因為我真的沒包過db,不是很清楚您說的是甚麼意思, 我也覺得我得程式亂亂的,但想不到更好寫法,還請您賜教
gmccntzx1: 目前看來,你應該是想要抓出word,然後再根據word抓出 06/04 23:19
gmccntzx1: 其他東西. 06/04 23:19
是的,我要抓關鍵字,再依照關鍵字去抓wiki裏面出現該關鍵字的文章ID
djshen: 我很好奇你之前怎麼用linked list 06/04 23:26
C++寫貪吃蛇 :P 一隻在8*8 led 上面跑的貪吃蛇,用按鈕控制左右,吃到東西就新增linked list這樣 不然就是一個可以新增刪除修改搜尋的會員管理系統,會把資料存到txt檔裡這樣也是c++
djshen: c++寫linked list你有像這篇一樣用demo[0][0]拿資料? 06/04 23:43
對不起,沒有QAQQQ 但我想說我每個節點的值可以讀,所以讀到demo[0][0]的值A, 然後在順著他指的link讀接下來的值 不過用linked list就不是長demo[0][0],然後每個節點會有兩個link, 一個指下一筆資料,一個指向該節點資料,大約這樣子
gmccntzx1: 新增一個Class MyData,用這個去存你要的資料. 這樣至少 06/04 23:47
gmccntzx1: 比一直用list[m][n][o]去抓資料容易懂 06/04 23:47
gmccntzx1: 其他你寫的東西我有稍微修改,不過整體沒有動到. 06/04 23:48
gmccntzx1: 等你確定做出要的功能後,再自己把code整理一下吧 06/04 23:49
gmccntzx1: 重貼 http://codepad.org/rTnBeOrz (上面的沒存成功) 06/04 23:52
我研究一下,我用eval是因為我有陣列存在DB,用eval讀他
gmccntzx1: 了解. 那剩下的你再試試看囉 06/04 23:55
好的我再試試
gmccntzx1: 記得你的那個叫做list的method最好改一下名稱. 06/04 23:55
原來想說就表單,沒想到名稱重複的問題,之後會改掉,感謝您 <3
gmccntzx1: 我的46行寫錯,左值應該要改成category[i] 06/04 23:58
好的感謝您 <3
gmccntzx1: 等等...我搞錯了. 那行不用改G_G 06/05 00:00
好唷XDD
gmccntzx1: 因為那邊本來就是要把category[i][j]這個word換成 06/05 00:01
gmccntzx1: MyData. 暈了我... 06/05 00:01
想開點,看到您寫的class我覺得您真的很強大, 我沒學過python,所以還不完全看的懂>////< ※ 編輯: st1009 (1.163.158.239), 06/05/2018 00:07:43
gmccntzx1: 別想的太複雜. 06/05 00:09
gmccntzx1: 1. __init__()就是物件的建構式,我在裡面加上word這個 06/05 00:10
gmccntzx1: 欄位,方便之後底下的__repr__去處理你要的功能. 06/05 00:10
init會那麼複雜是因為繼承了python原有的list物件是嘛?
gmccntzx1: 2. __repr__()是回傳物件的表示,像是print(object)時, 06/05 00:12
gmccntzx1: 就會去呼叫物件的__repr__() 06/05 00:12
細節譬如str(self[:])不懂在做啥,不過大約知道怎用了吧...
gmccntzx1: __init__()裡面,第一行是取出kwargs中為word的值 06/05 00:25
gmccntzx1: kwargs是一個dict,所以如果kwargs裡沒有key為word的值 06/05 00:26
gmccntzx1: 的話,就會回傳None. 06/05 00:27
gmccntzx1: 第二行super(...).__init__(...)則是呼叫父類別(list) 06/05 00:28
gmccntzx1: 的建構式__init__(). 06/05 00:28
gmccntzx1: self[:] ← 因為MyData是list,所以self[:]就是取出list 06/05 00:30
gmccntzx1: 內的所有元素. 06/05 00:30
gmccntzx1: 後面的if else就相當於C的三元運算子 06/05 00:31
大約明白一些了,請問那個滿滿的*號是甚麼意思? __init__函式裡的前3個引數有特殊意義,還是自定義的? 我開始再思考以後如何複製這個用法了了
gmccntzx1: 再稍微修改後的結果: http://codepad.org/QcD1aN0Z 06/05 00:34
gmccntzx1: 關於*args和**kwargs,看一下這個連結的說明 06/05 00:37
gmccntzx1: args和kwargs只是變數名稱,不一定非要用這幾個字 06/05 00:38
我覺得一步步看著自己親手打的程式愈來愈高級, 有種恍惚感,很高興有這樣學習的機會! 真心感謝您,已不知如何形容我的感謝了m(_ _)m
gmccntzx1: 然後在class裡面self這個關鍵字是指`物件自己` 06/05 00:39
self這個用法我剛好知道XDD 好像哪裡有看過一樣的用法
gmccntzx1: 不過正確說,`self`是大家常用的詞,不算是keyword 06/05 00:42
竟然!我一直以為是keyword
gmccntzx1: ok的! 有問題就再更新內容吧 06/05 00:43
好的謝謝您,明天要考試,再看一下應該就睡了,您也早點休息吧,晚安
gmccntzx1: 那算是coding style (詳見PEP8),就跟class method的第 06/05 00:44
gmccntzx1: 一個參數常用cls或clz一樣 06/05 00:45
gmccntzx1: ok 加油囉y 06/05 00:45
謝謝 <3
gmccntzx1: 突然想到,44行 mydata = getData(link, mydata.word) 06/05 01:11
gmccntzx1: 要改成1. mydata.append(getData(link, mydata.word)) 06/05 01:12
gmccntzx1: 寫錯,1. mydata.extend(getData(link, mydata.word)) 06/05 01:13
gmccntzx1: 或2. mydata[:] = getData(link, mydata.word) 06/05 01:14
st1009: 感謝您,昨晚就想說怎沒存起來,想今晚問XDD 06/05 08:17
flarehunter: 感覺你的需求用dict就可以了吧 06/05 13:03
flarehunter: [{'A': [A1, A2, A3], 'B': ..}, ...] 06/05 13:04
原始想法我要能取出A,這無法,不過其實我昨天思考過後發現取A好像可以不需要, 但不確定...還要等到做到更後面才知道,如果是這樣,確實可以用您的方法
pzyc79: demo[0][0] = {demo[0][0]: addA} print(demo[0][0]['A']) 06/05 17:58
好方法,不過我原來要求讀值是用demo[0][0][0] 因為這樣我好用for迴圈讀XDD 後日談: 我找到實作Linked list的方法了!其實不難,就是用類別包起來,再指一下 class ListNode: def __init__(self, x): self.val = x self.next = None ※ 編輯: st1009 (1.163.158.139), 07/03/2018 17:50:45