看板 Python 關於我們 聯絡資訊
各位好 我是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://www.ptt.cc/bbs/Python/M.1463376663.A.97F.html
OGCKM: 試試用iterator而不是用元素的陣列位置 05/16 13:50
OGCKM: 範例:http://goo.gl/sNXo8F 05/16 13:50
原來可以直接取用元素,謝謝你
mikapauli: 做1個複製,不要改變A 05/16 13:52
這部分我另一部分有這樣做,但是這邊是真的要刪光她XD 謝謝你
mikapauli: 你的例子可以直接 05/16 15:00
mikapauli: list(map((1).__sub__, 05/16 15:00
mikapauli: filter((2).__rmod__, map((1).__sub__, A)))) 05/16 15:00
mikapauli: list(filter((2).__rmod__, A)) 05/16 15:01
這...看不懂QQ,我先查一下filter跟map好了
bigpigbigpig: https://ideone.com/byJO6e 05/16 16:36
bigpigbigpig: 請勿在迴圈內任意新增、刪除、修改 iterable 的內容 05/16 16:38
可以問一下為什麼不行嗎? pop不是也是刪掉用的?
bigpigbigpig: 現在你刪掉的是 list 內的元素,尚有序可循,改天 05/16 22:15
bigpigbigpig: 如果刪掉dict或set的元素,可能會找不到應該在其中 05/16 22:16
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一併找不到嗎?
bigpigbigpig: dict{'a','b','c','d','e'}就很有可能,無論如何, 05/16 22:36
bigpigbigpig: Fluent Python 指出應避免在迴圈中更動 iterable 05/16 22:38
好的,謝謝,那我修改看看好了,現在看來Python的for用途好像跟C的for差有點多ORZ
mikapauli: 建議你可以直接描述你要做的事情。你舉的兩個例子有點 05/17 01:52
mikapauli: 太簡化以致於有很多不知道是不是特例的情況。像是A的元 05/17 01:56
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 但還在研究到底怎麼做
bigpigbigpig: list comprehension 可以一步做到 map 和 filter 05/17 02:39
bigpigbigpig: 組合運用的功能,其實就是我前面推文給的程式碼片段 05/17 02:40
了解,原來big大的那種用法叫做list comprehension (筆記 我覺得list comprehension看起來好像是做篩選+簡單地處理 函式部分應該可以獨立寫吧? 如果很長的函式擺進去看起來會很長吧XD
bigpigbigpig: 你看過用list comprehension寫的巴斯卡三角會很感動 05/17 07:34
喔喔喔喔喔 我查到了 看起來好像可以拿來改成我想要弄得,感謝
bigpigbigpig: 新增問題:from itertools import combinations 05/17 19:19
bigpigbigpig: A = [1, 2, 3, 4, 5] 05/17 19:19
bigpigbigpig: B = [ tuple(c) for c in combinations(A,2) 05/17 19:20
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 不知道我這樣理解有沒有錯
s06yji3: 你這是邏輯問題,跟python沒有太大的關係 05/18 18:38
s06yji3: https://goo.gl/bH5Lat 05/18 18:38
這種解法我還真想不到 直覺會想用兩個for 非常感謝你提供另一種思考方式
bibo9901: 你可以sort完 用兩個指標 一個從左掃 另一個從右掃 05/18 20:17
bibo9901: 掃到相撞就解決了 05/18 20:18
這樣也不錯耶,可以節省掃描次數,不過python也有指標?
s06yji3: 此指標非比指標,他的意思是用i,j。binary search 05/18 23:33
s06yji3: sorry,不是binary search 05/18 23:37
bibo9901: 如樓上所說. 用 index 就能代表指標 05/19 00:19
哦哦 了解 i從頭j從尾這樣 我一個問題解法好多哦XDDD 謝謝大家各種建議 ※ 編輯: dream0830 (123.195.114.31), 05/19/2016 01:22:16
eight0: B = [(i, 6 - i) for i in A if i < 3 and 6 - i in A] 05/19 03:21
s06yji3: 樓上好厲害QQ 05/19 10:43
看懂後覺得好強OAO ※ 編輯: dream0830 (123.195.114.31), 05/19/2016 15:20:47
kanggy: e大好厲害 O.O 05/19 16:22
ray60110: 一行解真的很猛 05/19 21:57
s860134: 真的突破盲點 用相反角度來完成 05/20 01:52