2011-04-17 64 views
0

我正在写一个单元测试,其中的一个检查返回包含子列表[[],[],[]]列表的方法,子列表的顺序并不重要,只有子列表和它们的值的数量,问题是,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个值,其中一个是无,我有2至4子表。

所以,我写了一个小的λ改变一个无为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是行不通的。但我不知道如何解决它。

回答

0

在Python 3异类比较,不再“只是工作”。我认为这种变化的基本原理是它们返回可能意想不到的结果。另外:我们不能再指定定制的排序一个cmp功能。所以我认为你是在正确的轨道上试图取代None值。

你可以这样用0替换None值:

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] 

然后你可以用assertEquals比较有序列表:

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) 
0

我猜中了就在我问的问题,该问题是传递给键功能价值为子列表中的一个,所以我只需要步行子列表,改变无0喜欢你与标准化的那样,这里是我的了:

# 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] 
    ]) 
) 

谢谢您的时间