sorted key =不适用于子列表

| 我正在编写一个单元测试,其中一个检查一种返回包含子列表
[[],[],[]]
的列表的方法,子列表的顺序不仅影响子列表的数量及其值,问题在于不赞成使用
TestCase.assertItemsEqual()
不是
TestCase.assertElementsEqual()
方法。为了解决该问题,我决定对方法返回的列表和单元测试中的列表进行排序,并比较排序后的版本,但是问题是子列表始终具有None值,并且排序会产生错误:
>>> sorted( [ [None], [1,2] ] )
Traceback (most recent call last):
  File \"<stdin>\", line 1, in <module>
TypeError: unorderable types: int() < NoneType()
实际上,我的子列表总是有8个值,其中一个是None,而我有2到4个子列表。 因此,我写了一个lambda,将None更改为0,因为顺序根本无关紧要,我只需要确保顺序是相同的即可:
>>> (lambda x: x if x is not None else 0)(None)
0
>>> (lambda x: x if x is not None else 0)(1)
1
但这行不通
>>> sorted( [ [None], [1,2] ], key = lambda x: x if x is not None else 0 )
Traceback (most recent call last):
  File \"<stdin>\", line 1, in <module>
TypeError: unorderable types: int() < NoneType()
该错误消息使我认为将NoneType更改为IntType可以解决,但是我知道lambda中的x值是子列表之一,这就是为什么lambda不能正常工作的原因。但是我不知道如何解决它。     
已邀请:
在Python 3中,异类比较不再“正常工作”。我认为此更改的理由是它们返回潜在的意外结果。另外:我们不能再为自定义排序指定
cmp
函数。因此,我认为您在尝试替换
None
值的方向正确。 您可以将
None
值替换为
0
,如下所示:
L = [[None], [1, 2]]
normalized = list(list(0 if i is None else i for i in x) for x in L)
# list-comprehension alternative:
# L2 = [[0 if i is None else i for i in x] for x in L]
然后,您可以使用ѭ11来比较排序后的列表:
expected_result = [[0], [1, 2]]
self.assertEquals(sorted(normalized), sorted(expected_result))
编辑: 当然可以优化以下内容,但是如果您需要任意嵌套级别的解决方案,那么这是一个开始:
import collections
def replace_nested(L, replacement=0):
    if None in L:
        for i,item in enumerate(L):
            if item is None:
                L[i] = replacement
    else:
        for i,S in enumerate(L):
            if isinstance(S, collections.Iterable) and not isinstance(S, str):
                replace_nested(S)
    
我问了一个问题后就说对了,问题是传递给键函数的值是子列表之一,所以我只需要遍历子列表并将None更改为0,就像您对normalized所做的那样,这就是我有:
# this sort a list with a sublist that has a None value in it - the None is changed to a 0 -
sort_none = lambda z: sorted( z, key= lambda x: [ 0 if y is None else y for y in x ] )
board = Board( [ 1,2,3 ,4,None,5 ,6,7,8 ] )
self.assertEqual( sort_none(board.valid_moves()),
    sort_none([
        [ 1,None,3 ,4,2,5 ,6,7,8],
        [ 1,2,3 ,None,4,5 ,6,7,8],
        [ 1,2,3 ,4,5,None ,6,7,8],
        [ 1,2,3, 4,7,5 ,6,None,8]
    ])
)
感谢您的时间     

要回复问题请先登录注册