How to use cmp() in Python 3?
PythonPython 3.xPython Problem Overview
I cannot get the command cmp()
to work.
Here is the code:
a = [1,2,3]
b = [1,2,3]
c = cmp(a,b)
print (c)
I am getting the error:
Traceback (most recent call last):
File "G:\Dropbox\Code\a = [1,2,3]", line 3, in <module>
c = cmp(a,b)
NameError: name 'cmp' is not defined
[Finished in 0.1s]
Python Solutions
Solution 1 - Python
As mentioned in the comments, cmp
doesn't exist in Python 3. If you really want it, you could define it yourself:
def cmp(a, b):
return (a > b) - (a < b)
which is taken from the original What's New In Python 3.0. It's pretty rare -- though not unheard of -- that it's really needed, though, so you might want to think about whether it's actually the best way to do whatever it is you're up to.
Solution 2 - Python
In Python 3.x you can import operator
and use operator module's eq()
, lt()
, etc... instead of cmp()
Solution 3 - Python
When the sign is needed, probably safest alternative is using math.copysign:
import math
ang = -2
# alternative for cmp(ang, 0):
math.copysign(1, ang)
# Result: -1
In particular if ang is of np.float64 type because of depreciation of the '-' operator. Example:
import numpy as np
def cmp_0(a, b):
return (a > b) - (a < b)
ang = np.float64(-2)
cmp_0(ang, 0)
# Result:
# DeprecationWarning: numpy boolean subtract, the `-` operator, is deprecated,
# use the bitwise_xor, the `^` operator, or the logical_xor function instead.
instead one could use:
def cmp_0(a, b):
return bool(a > b) - bool(a < b)
ang = np.float64(-2)
cmp(ang, 0)
# Result: -1
Solution 4 - Python
adding to @maxin's answer, in python 3.x
, if you want to compare two lists of tuples
a
and b
import operator
a = [(1,2),(3,4)]
b = [(3,4),(1,2)]
# convert both lists to sets before calling the eq function
print(operator.eq(set(a),set(b))) #True
Solution 5 - Python
While in the general case, these are all good replacements for cmp()
, for the actual use case given by the original poster, surely
a = [1,2,3]
b = [1,2,3]
c = a != b
print(c)
or just
a = [1,2,3]
b = [1,2,3]
print(a != b)
would work quite well.
Solution 6 - Python
If a or b is a class object, then the above answers will have the compilation error as below: For example: a is Class Clock:
File "01_ClockClass_lab16.py", line 14, in cmp
return (a > b) - (a < b)
TypeError: '>' not supported between instances of 'Clock' and 'Clock'
Change the type with int() to remove the error:
def cmp(a, b):
return (int(a) > int(b)) - (int(a) < int(b))
Solution 7 - Python
This cmp()
function works only on Python version 2.x, if you try to use it in version 3.x it will give an error:
NameError: name 'cmp' is not defined
[Finished in 0.1s with exit code 1]
See the code below:
a=60
b=90
print(cmp(a,b))
output:
-1
While comparing integers cmp() just performs subtraction of its argument i.e in this case a-b, if subtraction is -ve it returns -1 i.e ab
a=90
b=60
print(cmp(a,b))
output:
1
Again:
a="abc"
b="abc"
print(cmp(a,b))
output:
0
when both the arguments are equal i.e a=b, it returns 0 as output. Here, we have passed two string type of values. Here, cmp() compares both the strings character by character and if found same then returns 0.