[問題] Python List增減 (已解決 非常感謝)

看板Python作者 (異影)時間9年前 (2016/05/16 13:31), 9年前編輯推噓8(8028)
留言36則, 9人參與, 最新討論串1/1
各位好 我是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

05/16 13:50, , 1F
試試用iterator而不是用元素的陣列位置
05/16 13:50, 1F

05/16 13:50, , 2F
05/16 13:50, 2F
原來可以直接取用元素,謝謝你

05/16 13:52, , 3F
做1個複製,不要改變A
05/16 13:52, 3F
這部分我另一部分有這樣做,但是這邊是真的要刪光她XD 謝謝你

05/16 15:00, , 4F
你的例子可以直接
05/16 15:00, 4F

05/16 15:00, , 5F
list(map((1).__sub__,
05/16 15:00, 5F

05/16 15:00, , 6F
filter((2).__rmod__, map((1).__sub__, A))))
05/16 15:00, 6F

05/16 15:01, , 7F
list(filter((2).__rmod__, A))
05/16 15:01, 7F
這...看不懂QQ,我先查一下filter跟map好了

05/16 16:36, , 8F

05/16 16:38, , 9F
請勿在迴圈內任意新增、刪除、修改 iterable 的內容
05/16 16:38, 9F
可以問一下為什麼不行嗎? pop不是也是刪掉用的?

05/16 22:15, , 10F
現在你刪掉的是 list 內的元素,尚有序可循,改天
05/16 22:15, 10F

05/16 22:16, , 11F
如果刪掉dict或set的元素,可能會找不到應該在其中
05/16 22:16, 11F

05/16 22:18, , 12F
的元素(更動了hash),可參閱 Fluent Python Ch 3。
05/16 22:18, 12F
意思是 我的A是list[1,2,3,4,5],刪除1,2 還不會影響 但是若 A是 dict {1,2,3,4,5},刪除1,2 可能會導致3,4,5一併找不到嗎?

05/16 22:36, , 13F
dict{'a','b','c','d','e'}就很有可能,無論如何,
05/16 22:36, 13F

05/16 22:38, , 14F
Fluent Python 指出應避免在迴圈中更動 iterable
05/16 22:38, 14F
好的,謝謝,那我修改看看好了,現在看來Python的for用途好像跟C的for差有點多ORZ

05/17 01:52, , 15F
建議你可以直接描述你要做的事情。你舉的兩個例子有點
05/17 01:52, 15F

05/17 01:56, , 16F
太簡化以致於有很多不知道是不是特例的情況。像是A的元
05/17 01:56, 16F

05/17 01:56, , 17F
素不會重覆嗎
05/17 01:56, 17F
我想說簡化後比較好描述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 但還在研究到底怎麼做

05/17 02:39, , 18F
list comprehension 可以一步做到 map 和 filter
05/17 02:39, 18F

05/17 02:40, , 19F
組合運用的功能,其實就是我前面推文給的程式碼片段
05/17 02:40, 19F
了解,原來big大的那種用法叫做list comprehension (筆記 我覺得list comprehension看起來好像是做篩選+簡單地處理 函式部分應該可以獨立寫吧? 如果很長的函式擺進去看起來會很長吧XD

05/17 07:34, , 20F
你看過用list comprehension寫的巴斯卡三角會很感動
05/17 07:34, 20F
喔喔喔喔喔 我查到了 看起來好像可以拿來改成我想要弄得,感謝

05/17 19:19, , 21F
新增問題:from itertools import combinations
05/17 19:19, 21F

05/17 19:19, , 22F
A = [1, 2, 3, 4, 5]
05/17 19:19, 22F

05/17 19:20, , 23F
B = [ tuple(c) for c in combinations(A,2)
05/17 19:20, 23F

05/17 19:20, , 24F
if sum(c) == 6 ]
05/17 19:20, 24F
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 不知道我這樣理解有沒有錯

05/18 18:38, , 25F
你這是邏輯問題,跟python沒有太大的關係
05/18 18:38, 25F

05/18 18:38, , 26F
05/18 18:38, 26F
這種解法我還真想不到 直覺會想用兩個for 非常感謝你提供另一種思考方式

05/18 20:17, , 27F
你可以sort完 用兩個指標 一個從左掃 另一個從右掃
05/18 20:17, 27F

05/18 20:18, , 28F
掃到相撞就解決了
05/18 20:18, 28F
這樣也不錯耶,可以節省掃描次數,不過python也有指標?

05/18 23:33, , 29F
此指標非比指標,他的意思是用i,j。binary search
05/18 23:33, 29F

05/18 23:37, , 30F
sorry,不是binary search
05/18 23:37, 30F

05/19 00:19, , 31F
如樓上所說. 用 index 就能代表指標
05/19 00:19, 31F
哦哦 了解 i從頭j從尾這樣 我一個問題解法好多哦XDDD 謝謝大家各種建議 ※ 編輯: dream0830 (123.195.114.31), 05/19/2016 01:22:16

05/19 03:21, , 32F
B = [(i, 6 - i) for i in A if i < 3 and 6 - i in A]
05/19 03:21, 32F

05/19 10:43, , 33F
樓上好厲害QQ
05/19 10:43, 33F
看懂後覺得好強OAO ※ 編輯: dream0830 (123.195.114.31), 05/19/2016 15:20:47

05/19 16:22, , 34F
e大好厲害 O.O
05/19 16:22, 34F

05/19 21:57, , 35F
一行解真的很猛
05/19 21:57, 35F

05/20 01:52, , 36F
真的突破盲點 用相反角度來完成
05/20 01:52, 36F
文章代碼(AID): #1NELiNb_ (Python)
文章代碼(AID): #1NELiNb_ (Python)