TypeError:unorderable类型:tuple()< Python 3中的int()

时间:2015-09-26 17:50:51

标签: python sorting python-3.x

以下代码是订购扑克手。它在Python 2.7中运行良好但在Python 3中不起作用。有哪些更改导致它给出TypeError:unorderable类型:tuple()< INT()?

def poker(hands):
    scores = [(i, score(hand.split())) for i, hand in enumerate(hands)]
    winner = sorted(scores , key=lambda x:x[1])[-1][0]
    return hands[winner]

def score(hand):
    ranks = '23456789TJQKA'
    rcounts = {ranks.find(r): ''.join(hand).count(r) for r, _ in hand}.items()
    score, ranks = zip(*sorted((cnt, rank) for rank, cnt in rcounts)[::-1])
    if len(score) == 5:
        if ranks[0:2] == (12, 3): #adjust if 5 high straight
            ranks = (3, 2, 1, 0, -1)
        straight = ranks[0] - ranks[4] == 4
        flush = len({suit for _, suit in hand}) == 1
        '''no pair, straight, flush, or straight flush'''
        score = ([1, (3,1,1,1)], [(3,1,1,2), (5,)])[flush][straight]
    return score, ranks

 >>> poker(['8C TS KC 9H 4S', '7D 2S 5D 3S AC', '8C AD 8D AC 9C', '7C 5H 8D TD KS'])
 '8C AD 8D AC 9C'

2 个答案:

答案 0 :(得分:4)

这是因为您正在比较inttuple。在python2x中,为不同的内置对象定义了默认的cmp操作,这些操作已在python3中删除。

  

Python 3忽略 cmp ()方法。除此之外,cmp()函数也不见了!这通常会导致转换后的代码引发TypeError:unorderable types错误。因此,您需要使用丰富的比较方法替换 cmp ()方法。为了支持排序,您只需要实现 lt (),用于“less then”运算符的方法<。

Official documentation

所以,在python2中,我们可以做这样的事情

(2, 3) > 2

但它在python3中引发了TypeError。如果这个代码在python2中工作,那么很可能是默认比较行为隐式处理的bug。

现在在你的例子中: -

#value of scores that are being compared for sorting
scores = [(0, (1, (11, 8, 7, 6, 2))), (1, (1, (12, 5, 3, 1, 0))), (2, ((2, 2, 1), (12, 6, 7))), (3, (1, (11, 8, 6, 5, 3)))]

print(type(scores[1][1][0])) # <class 'int'>
print(type(scores[2][1][0])) # <class 'tuple'>

正如我所解释的那样在python3中不起作用。您在比较tupleint时所采用的标准是什么。

如果您真的想要比较不同类型的对象,那么您需要推出自己的tuple版本,并在scores中使用该对象。

class MyTuple(tuple):

     def __lt__(self, other):
        pass

Default tuple comparison python 2

注意: - 我不建议使用这种方法。这只是出于教学目的。

答案 1 :(得分:2)

解决方案: 将整数转换为元组: 得分=([(1,),(3,1,1,1)],[(3,1,1,2),(5,)])[冲洗] [直]