今天有一个同事给我出了一个这样的问题:
你如何把list of list 变成list 比如[[1,2],[3]] --> [1,2,3]
程序的目的就是将一个递归的列表转化为一个普通的”单”列表
本来这个程序是可以使用一个简单的方法来实现的:
先定义一个全局的列表,然后遍历列表中的元素,如果是元素就加入到全局列表,
但如果是列表,那就用递归或是迭代的方式继续遍历它。
不过这种方式不够geek
,用 yield
可以做的更好。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import unittest
def untangle(ele): try: for e in ele: for i in untangle(e): yield i except TypeError: yield ele
class UntangleTestCase(unittest.TestCase): def setUp(self): self.untangle = untangle self.g = lambda x: [i for i in self.untangle(x)]
def test_average(self): seq = self.g([[1,2,3],[4,5,6]]) self.assertEqual(seq, [1,2,3,4,5,6])
def test_empty(self): seq = self.g([]) self.assertEqual(seq, [])
def test_single(self): seq = self.g([1,2,3,4,5]) self.assertEqual(seq, [1,2,3,4,5])
if __name__ == '__main__': unittest.main()
|
你只需要将一个递归列表传给 untangle
函数,然后它的所有元素就会在内部通过递归的方式由yield
生成。那么你只需要迭代这个 untangle
的返回值就行了。(用列表生成式最好)
从单元测试中可以看到,untangle
能够处理,递归列表, 空列表, 单列表。