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