作者pmove (cowabunga)
看板Python
标题[问题] x!=y!=z!=I!=j 这样如何简洁写?
时间Sat May 23 17:45:07 2020
如果三个变数,互相都不等於。罗辑上是
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://webptt.com/cn.aspx?n=bbs/Python/M.1590227109.A.0D3.html
2F:推 Yshuan: 推 取set很棒 05/23 18:04
3F:→ pmove: C大好方法,也就是 5 == len(set(x,y,z,I,j)) 05/23 18:10
4F:→ pmove: 但是如果 x,y,z,I,j 是class, 那就无法用set, 这时有无好方 05/23 18:12
5F:→ pmove: 法? 05/23 18:12
6F:推 TitanEric: 感觉用all也可以 05/23 18:12
7F:→ TitanEric: class有override equal跟hash就可以 05/23 18:13
8F:→ outshaker: class可以用id 或 hash 来判断阿 05/23 18:20
9F:→ pmove: 例如变数是list的情况,x=[2,1,1], y=[1,2,1], z=[2,1,1], 05/23 18:49
10F:→ pmove: I=[1,1,2], j=[2,2,1]. 这种情况set((x,y,z,I,j))会有错, 05/23 18:49
11F:→ pmove: 有何好方法? 05/23 18:49
12F:→ pmove: 转成tuple是一种方法 05/23 18:53
13F:→ pmove: Ok, 感谢以上各位大大的回答 05/23 18:54
14F:推 vi000246: 如果是复杂情况就override equal再用for loop判断吧 05/23 19:52
15F:→ outshaker: 复杂变数要检查互不相等,就写回圈检查阿 05/23 19:54
16F:→ zerof: operator.ne 05/23 20:30
17F:推 ddavid: 如果该class可以被sort的话,单纯的两两比较是O(n^2),先 05/23 20:30
18F:→ ddavid: sort後只比较相邻元素是O(nlogn + n) = O(nlogn)会好一点 05/23 20:31
19F:→ ddavid: 另外上面提到hash也是一种方式,就是看看要花多少额外空间 05/23 20:32
20F:→ pmove: 回z大, operator.ne只能传入两个arguments的样子,没法多个 05/23 22:03
21F:→ alvinlin: 我感觉原来的最简洁好懂。不知道为何要缘木求鱼。x != y 05/24 03:25
22F:→ alvinlin: and x != z and y != z不是挺好的 05/24 03:25
23F:推 oToToT: 他应该试想处里有很多变数的情况吧,例如1000个之类的 05/24 14:46
24F:→ zerof: ....你可以用 list comprehension +zip 05/24 17:32
25F:→ zerof: zip 会漏, itertools.combinations 才对 05/24 18:08
26F:推 alan23273850: 这种问题 stackoverflow 上面应该很多ㄅ 05/24 18:28
27F:→ pmove: 回z大, combinations我知,不过很多变数的情况,个人觉得c 05/24 20:42
28F:→ pmove: 大的set法,速度会比较快 05/24 20:42
29F:→ s860134: 直觉 hash table 查数量确实会快一点 05/30 18:02