作者dream0830 (异影)
看板Python
标题[问题] Python List增减
时间Mon May 16 13:31:00 2016
各位好
我是python新手,原本是写C为主
最近在尝试python,有些问题想请教各位
我设定了一个List
想用for去做筛选,筛选出来我就把它放到另一个List中
目前的架构大概是这样 (简化版本)
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])
但是我发现筛选到最後 一定会出现
IndexError: list index out of range
我猜想这部分应该是因为我移除了List元素後,
A的长度缩减,原本A[5]可能变成A[4],而i继续递增,导致检查不到
我尝试找相关的解法,但是抓不到关键字
拜托各位指教了,非常感谢
新增问题
请问若以iterator的方式
要怎麽做双重回圈以上的筛选呢
一般使用C的时候 因为是用阵列位置,所以就是用i , i+1就可以了
难道python可以直接抽一组出来?
例如我要把上面 A的元素 相加为6的元素组起来放到B里面
直觉我是用
for i ...
for j=i+1 ...
一一去比对
可是照下面O大的方法,直接提取元素应该是不能这样+1的吧?
谢谢各位不吝指教 (鞠躬
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.195.114.31
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1463376663.A.97F.html
1F:推 OGCKM: 试试用iterator而不是用元素的阵列位置 05/16 13:50
原来可以直接取用元素,谢谢你
3F:→ mikapauli: 做1个复制,不要改变A 05/16 13:52
这部分我另一部分有这样做,但是这边是真的要删光她XD
谢谢你
4F:→ mikapauli: 你的例子可以直接 05/16 15:00
5F:→ mikapauli: list(map((1).__sub__, 05/16 15:00
6F:→ mikapauli: filter((2).__rmod__, map((1).__sub__, A)))) 05/16 15:00
7F:→ mikapauli: list(filter((2).__rmod__, A)) 05/16 15:01
这...看不懂QQ,我先查一下filter跟map好了
9F:→ bigpigbigpig: 请勿在回圈内任意新增、删除、修改 iterable 的内容 05/16 16:38
可以问一下为什麽不行吗? pop不是也是删掉用的?
10F:→ bigpigbigpig: 现在你删掉的是 list 内的元素,尚有序可循,改天 05/16 22:15
11F:→ bigpigbigpig: 如果删掉dict或set的元素,可能会找不到应该在其中 05/16 22:16
12F:→ bigpigbigpig: 的元素(更动了hash),可参阅 Fluent Python Ch 3。 05/16 22:18
意思是 我的A是list[1,2,3,4,5],删除1,2 还不会影响
但是若 A是 dict {1,2,3,4,5},删除1,2 可能会导致3,4,5一并找不到吗?
13F:→ bigpigbigpig: dict{'a','b','c','d','e'}就很有可能,无论如何, 05/16 22:36
14F:→ bigpigbigpig: Fluent Python 指出应避免在回圈中更动 iterable 05/16 22:38
好的,谢谢,那我修改看看好了,现在看来Python的for用途好像跟C的for差有点多ORZ
15F:→ mikapauli: 建议你可以直接描述你要做的事情。你举的两个例子有点 05/17 01:52
16F:→ mikapauli: 太简化以致於有很多不知道是不是特例的情况。像是A的元 05/17 01:56
17F:→ mikapauli: 素不会重覆吗 05/17 01:56
我想说简化後比较好描述QQ,然後我自己在测试也比较简单这样
重复性基本上不会,我把它简化成1,2,3
而实际上可能是(1,1,2,3,9),(1,1,3,4,7),(2,1,3,4,7)之类的组合
因为有做序号区分,第一个就是序号
序号可能一样,但序号一样时,其他属性不会完全重复
第二个我是想要做分组
例如 A= [1,2,3,4,5] B=[]
我想要让A里面可以相加为6的一组
筛选後的结果变成
A = [3]
B = [(1,5),(2,4)]
如果我用C写就是会用两个FOR去比对
1先跟2345配对 找到5 取出 (1,5)放到B
2跟剩下的 34配对 找到4 取出 (2,4)放到B
3没人配了 只好留着
根据B大的建议,不要修改A,所以目前是想这样弄,但是觉得怪怪的ORZ
For i in A:
For j in A:
if i+j ==6
B.append(i,j)
else
NewA.append(i)
查了map和filter那些的用法,看起来好像可以用map
但还在研究到底怎麽做
18F:→ bigpigbigpig: list comprehension 可以一步做到 map 和 filter 05/17 02:39
19F:→ bigpigbigpig: 组合运用的功能,其实就是我前面推文给的程式码片段 05/17 02:40
了解,原来big大的那种用法叫做list comprehension (笔记
我觉得list comprehension看起来好像是做筛选+简单地处理
函式部分应该可以独立写吧? 如果很长的函式摆进去看起来会很长吧XD
20F:→ bigpigbigpig: 你看过用list comprehension写的巴斯卡三角会很感动 05/17 07:34
喔喔喔喔喔 我查到了 看起来好像可以拿来改成我想要弄得,感谢
21F:→ bigpigbigpig: 新增问题:from itertools import combinations 05/17 19:19
22F:→ bigpigbigpig: A = [1, 2, 3, 4, 5] 05/17 19:19
23F:→ bigpigbigpig: B = [ tuple(c) for c in combinations(A,2) 05/17 19:20
24F:→ bigpigbigpig: if sum(c) == 6 ] 05/17 19:20
OAO,我自己改了半天还是不会动ORZ 感谢
B = [ tuple(c) for c in combinations(A,2) if sum(c) == 6 ]
所以这边是
combinations(A,2) 先列出
1,2 2,3 3,4 4,5
1,3 2,4 3,5
1,4 2,5
1,5
然後用if sum(c)=6
筛选掉不符合的部分
最後再用tuple定义剩下的C型态,然後放进B
不知道我这样理解有没有错
25F:推 s06yji3: 你这是逻辑问题,跟python没有太大的关系 05/18 18:38
这种解法我还真想不到 直觉会想用两个for 非常感谢你提供另一种思考方式
27F:→ bibo9901: 你可以sort完 用两个指标 一个从左扫 另一个从右扫 05/18 20:17
28F:→ bibo9901: 扫到相撞就解决了 05/18 20:18
这样也不错耶,可以节省扫描次数,不过python也有指标?
29F:推 s06yji3: 此指标非比指标,他的意思是用i,j。binary search 05/18 23:33
30F:推 s06yji3: sorry,不是binary search 05/18 23:37
31F:→ bibo9901: 如楼上所说. 用 index 就能代表指标 05/19 00:19
哦哦 了解 i从头j从尾这样 我一个问题解法好多哦XDDD 谢谢大家各种建议
※ 编辑: dream0830 (123.195.114.31), 05/19/2016 01:22:16
32F:推 eight0: B = [(i, 6 - i) for i in A if i < 3 and 6 - i in A] 05/19 03:21
33F:推 s06yji3: 楼上好厉害QQ 05/19 10:43
看懂後觉得好强OAO
※ 编辑: dream0830 (123.195.114.31), 05/19/2016 15:20:47
34F:推 kanggy: e大好厉害 O.O 05/19 16:22
35F:推 ray60110: 一行解真的很猛 05/19 21:57
36F:→ s860134: 真的突破盲点 用相反角度来完成 05/20 01:52