Re: [问题] Python List增减 (新增问题)

楼主: SocketAM2 (AM2)   2016-05-17 00:12:30
※ 引述《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中的元素挖掉的时候还是会空一个在那吧
作者: dream0830 (异影)   2016-05-17 00:31:00
谢谢S大的回答,S大给的范例中,有两行我不懂new_A.append([]) 和 new_A[-1].append(each)另外会直觉用双循环,是因为我想要把LIST中的元素两两一组,然后摆放到Dict中A[0]要找A[1]~A[4] A[1]要找A[2]~A[4] 类似这样然后A[1,2,3,4,5]剩下 A[3], B[(1,5),(2,4)]这样ERROR的原因我是用Printf看i跟len的长度后猜想的XD目前研究了一下,看起来好像可以用map搭配两个变量去做到我上面想做的筛选,可是还不太清楚MAP如何运作哦哦 所以-1的意思是加入尾端,跟直接append不一样吗?前面已经宣告new_A=[] 为什么还要在尾端新增[]?

Links booklink

Contact Us: admin [ a t ] ucptt.com