Pulpcode

捕获,搅碎,拼接,吞咽

0%

一个递归列表解引用为单列表

今天有一个同事给我出了一个这样的问题:

你如何把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
# -*-coding: utf-8 -*-
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 能够处理,递归列表, 空列表, 单列表。