[问题] 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