作者SocketAM2 (AM2)
看板Python
标题Re: [问题] Python List增减 (新增问题)
时间Tue May 17 00:12:30 2016
※ 引述《dream0830 (异影)》之铭言:
: A = [1,2,3,4,5]
: B = []
:
: for i in range(len(A)):
: if A[i] % 2 ==0
: B.append(A[i])
: A.remove(A[i])
Error的原因很单纯啦 一行一行跟着想就懂了
当i == 0时
A == [1,2,3,4,5]
B == []
A[i] == 1 => if 不成立,没事
当i == 1时
A == [1,2,3,4,5]
B == []
A[i] == 2 => if 成立
B = [2]
A = [1,3,4,5]
当i == 2时
A == [1,3,4,5]
B == [2]
A[i] == 4 => if 成立
B = [2,4]
A = [1,3,5]
当i == 3时
A == [1,3,5]
B == [2,4]
A[i] out of range
: 新增问题
: 请问若以iterator的方式
: 要怎麽做双重回圈以上的筛选呢
给定
A = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
B = []
如果不要求A list原地修改的话
我想到最容易给新手懂的作法是这样:
new_A = []
for level_one in A:
new_A.append([])
for each in level_one:
if each % 2 == 0:
B.append(each)
else:
new_A[-1].append(each)
A = new_A
bigpigbigpig大说的确实是python的禁忌
"请勿在回圈内任意新增、删除、修改 iterable 的内容"
大概类似C_C++版前阵子热门的13戒吧
根本的原因先不论的话,新手可以先照做
应对的方法很多种,如上面就是"另起炉灶不动iterable"
也可以"改用另一个iterable,改原本的iterable",例如
for i, level_one in enumerate(A[:]):
for each in level_one:
if each % 2 == 0:
B.append(each)
else:
A[i].remove(each)
注:演算法上这比前一个慢,因为list.remove是O(N),append是O(1)
另,实作要加速的话map, filter, list comprehension之类很有用
: 一般使用C的时候 因为是用阵列位置,所以就是用i , i+1就可以了
: 难道python可以直接抽一组出来?
: 例如我要把上面 A的元素 相加为6的元素组起来放到B里面
: 直觉我是用
: for i ...
: for j=i+1 ...
: 一一去比对
: 可是照下面O大的方法,直接提取元素应该是不能这样+1的吧?
就算是C,iterate i, j,要把A中的元素挖掉的时候还是会空一个在那吧
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 58.114.176.157
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1463415153.A.E0E.html
1F:推 dream0830: 谢谢S大的回答,S大给的范例中,有两行我不懂 05/17 00:31
2F:→ dream0830: new_A.append([]) 和 new_A[-1].append(each) 05/17 00:31
在new_A的尾端新增一个空白list
new_A的最後一个元素(是个上面加入过的list)的尾端新增each
3F:→ dream0830: 另外会直觉用双回圈,是因为我想要把LIST中的元素 05/17 00:32
4F:→ dream0830: 两两一组,然後摆放到Dict中 05/17 00:33
5F:→ dream0830: A[0]要找A[1]~A[4] A[1]要找A[2]~A[4] 类似这样 05/17 00:34
6F:→ dream0830: 然後A[1,2,3,4,5]剩下 A[3], B[(1,5),(2,4)]这样 05/17 00:35
7F:→ dream0830: ERROR的原因我是用Printf看i跟len的长度後猜想的XD 05/17 00:35
这边对半夜一点的我实在太深奥了,请其他高手回答吧...
8F:→ dream0830: 目前研究了一下,看起来好像可以用map搭配两个变数 05/17 00:36
9F:→ dream0830: 去做到我上面想做的筛选,可是还不太清楚MAP如何运作 05/17 00:36
据我所知,map能做到的事情for应该都能做到
只是map用的好的话能快很多而已 (只是系数上的快不是演算法上的快)
我建议你先弄熟list/dict/for再来学map/reduce等等
(若不对的话跪请神人指教)
※ 编辑: SocketAM2 (58.114.176.157), 05/17/2016 01:03:49
10F:推 dream0830: 哦哦 所以-1的意思是加入尾端,跟直接append不一样吗? 05/17 01:34
11F:→ dream0830: 前面已经宣告new_A=[] 为什麽还要在尾端新增[]? 05/17 01:35