作者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/cn.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