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

作者: pmove (金疾檸檬)   2020-05-23 17:45:07
如果三個變數,互相都不等於。羅輯上是
x != y != z
但是這樣寫是錯的,必需寫成:
x != y and x != z and y != z
那如果要多個變數,互相都不相等,
舉個例子,例如,5個變數互不相等,
即 x != y != z != I != j
那有啥簡潔又正確的寫法嗎?
我是問Python 3, 謝謝。
作者: cuteSquirrel (松鼠)   2020-05-23 17:57:00
作者: Yshuan (倚絃)   2020-05-23 18:04:00
推 取set很棒
作者: pmove (金疾檸檬)   2020-05-23 18:10:00
C大好方法,也就是 5 == len(set(x,y,z,I,j))但是如果 x,y,z,I,j 是class, 那就無法用set, 這時有無好方法?
作者: TitanEric (泰坦)   2020-05-23 18:12:00
感覺用all也可以class有override equal跟hash就可以
作者: outshaker (out)   2020-05-23 18:20:00
class可以用id 或 hash 來判斷阿
作者: pmove (金疾檸檬)   2020-05-23 18:49:00
例如變數是list的情況,x=[2,1,1], y=[1,2,1], z=[2,1,1],I=[1,1,2], j=[2,2,1]. 這種情況set((x,y,z,I,j))會有錯,有何好方法?轉成tuple是一種方法Ok, 感謝以上各位大大的回答
作者: vi000246 (Vi)   2020-05-23 19:52:00
如果是複雜情況就override equal再用for loop判斷吧
作者: outshaker (out)   2020-05-23 19:54:00
複雜變數要檢查互不相等,就寫迴圈檢查阿
作者: zerof (貓橘毛發呆雕像)   2020-05-23 20:30:00
operator.ne
作者: ddavid (謊言接線生)   2020-05-23 20:30:00
如果該class可以被sort的話,單純的兩兩比較是O(n^2),先sort後只比較相鄰元素是O(nlogn + n) = O(nlogn)會好一點另外上面提到hash也是一種方式,就是看看要花多少額外空間
作者: pmove (金疾檸檬)   2020-05-23 22:03:00
回z大, operator.ne只能傳入兩個arguments的樣子,沒法多個
作者: alvinlin (林矜業)   2020-05-24 03:25:00
我感覺原來的最簡潔好懂。不知道為何要緣木求魚。x != yand x != z and y != z不是挺好的
作者: oToToT (屁孩)   2020-05-24 14:46:00
他應該試想處裡有很多變數的情況吧,例如1000個之類的
作者: zerof (貓橘毛發呆雕像)   2020-05-24 17:32:00
....你可以用 list comprehension +zipzip 會漏, itertools.combinations 才對
作者: alan23273850   2020-05-24 18:28:00
這種問題 stackoverflow 上面應該很多ㄅ
作者: pmove (金疾檸檬)   2020-05-24 20:42:00
回z大, combinations我知,不過很多變數的情況,個人覺得c大的set法,速度會比較快
作者: s860134 (s860134)   2020-05-30 18:02:00
直覺 hash table 查數量確實會快一點

Links booklink

Contact Us: admin [ a t ] ucptt.com