[問題] x!=y!=z!=I!=j 這樣如何簡潔寫?

看板Python作者 (cowabunga)時間5年前 (2020/05/23 17:45), 編輯推噓7(7022)
留言29則, 12人參與, 5年前最新討論串1/1
如果三個變數,互相都不等於。羅輯上是 x != y != z 但是這樣寫是錯的,必需寫成: x != y and x != z and y != z 那如果要多個變數,互相都不相等, 舉個例子,例如,5個變數互不相等, 即 x != y != z != I != j 那有啥簡潔又正確的寫法嗎? 我是問Python 3, 謝謝。 ----- Sent from JPTT on my iPhone -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.136.42.3 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1590227109.A.0D3.html

05/23 17:57, 5年前 , 1F

05/23 18:04, 5年前 , 2F
推 取set很棒
05/23 18:04, 2F

05/23 18:10, 5年前 , 3F
C大好方法,也就是 5 == len(set(x,y,z,I,j))
05/23 18:10, 3F

05/23 18:12, 5年前 , 4F
但是如果 x,y,z,I,j 是class, 那就無法用set, 這時有無好方
05/23 18:12, 4F

05/23 18:12, 5年前 , 5F
法?
05/23 18:12, 5F

05/23 18:12, 5年前 , 6F
感覺用all也可以
05/23 18:12, 6F

05/23 18:13, 5年前 , 7F
class有override equal跟hash就可以
05/23 18:13, 7F

05/23 18:20, 5年前 , 8F
class可以用id 或 hash 來判斷阿
05/23 18:20, 8F

05/23 18:49, 5年前 , 9F
例如變數是list的情況,x=[2,1,1], y=[1,2,1], z=[2,1,1],
05/23 18:49, 9F

05/23 18:49, 5年前 , 10F
I=[1,1,2], j=[2,2,1]. 這種情況set((x,y,z,I,j))會有錯,
05/23 18:49, 10F

05/23 18:49, 5年前 , 11F
有何好方法?
05/23 18:49, 11F

05/23 18:53, 5年前 , 12F
轉成tuple是一種方法
05/23 18:53, 12F

05/23 18:54, 5年前 , 13F
Ok, 感謝以上各位大大的回答
05/23 18:54, 13F

05/23 19:52, 5年前 , 14F
如果是複雜情況就override equal再用for loop判斷吧
05/23 19:52, 14F

05/23 19:54, 5年前 , 15F
複雜變數要檢查互不相等,就寫迴圈檢查阿
05/23 19:54, 15F

05/23 20:30, 5年前 , 16F
operator.ne
05/23 20:30, 16F

05/23 20:30, 5年前 , 17F
如果該class可以被sort的話,單純的兩兩比較是O(n^2),先
05/23 20:30, 17F

05/23 20:31, 5年前 , 18F
sort後只比較相鄰元素是O(nlogn + n) = O(nlogn)會好一點
05/23 20:31, 18F

05/23 20:32, 5年前 , 19F
另外上面提到hash也是一種方式,就是看看要花多少額外空間
05/23 20:32, 19F

05/23 22:03, 5年前 , 20F
回z大, operator.ne只能傳入兩個arguments的樣子,沒法多個
05/23 22:03, 20F

05/24 03:25, 5年前 , 21F
我感覺原來的最簡潔好懂。不知道為何要緣木求魚。x != y
05/24 03:25, 21F

05/24 03:25, 5年前 , 22F
and x != z and y != z不是挺好的
05/24 03:25, 22F

05/24 14:46, 5年前 , 23F
他應該試想處裡有很多變數的情況吧,例如1000個之類的
05/24 14:46, 23F

05/24 17:32, 5年前 , 24F
....你可以用 list comprehension +zip
05/24 17:32, 24F

05/24 18:08, 5年前 , 25F
zip 會漏, itertools.combinations 才對
05/24 18:08, 25F

05/24 18:28, 5年前 , 26F
這種問題 stackoverflow 上面應該很多ㄅ
05/24 18:28, 26F

05/24 20:42, 5年前 , 27F
回z大, combinations我知,不過很多變數的情況,個人覺得c
05/24 20:42, 27F

05/24 20:42, 5年前 , 28F
大的set法,速度會比較快
05/24 20:42, 28F

05/30 18:02, 5年前 , 29F
直覺 hash table 查數量確實會快一點
05/30 18:02, 29F
文章代碼(AID): #1UoF2b3J (Python)
文章代碼(AID): #1UoF2b3J (Python)