| 
                         想把一个列表解包成一个一个元素,就这样: 
- 1elems = [1, 2, 3, 4] 
 - 2a, b, c, d = elems 
 - 3print(a, b, c, d) 
 - 4 
 - 5==> 1 2 3 4 
 
  
也可以这样: 
- 1elems = [1, 2, 3, 4] 
 - 2a, b, c, d = elems 
 - 3print(a, b, c, d) 
 - 4 
 - 5==> 1 2 3 4 
 
  
2.2、切片 (Slicing) 
大家可能知道,如果想把一个列表反过来排,就用 [::-1] 。 
- 1elems = list(range(10)) 
 - 2print(elems) 
 - 3 
 - 4==> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
 - 5 
 - 6print(elems[::-1]) 
 - 7 
 - 8==> [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 
 
  
而 [x:y:z] 这种语法的意思是,从索引x到索引y,每z个元素取一个。 
如果z是负数,就是反向取了。 
如果x不特别指定,就默认是在遍历列表的方向上,遇到的第一个元素。 
如果y不特别指定,就默认是列表最后一个元素。 
所以,我们要从一个列表里面,每两个取一个的话,就是 [::2] 。 
- 1evens = elems[::2] 
 - 2print(evens) 
 - 3 
 - 4reversed_evens = elems[-2::-2] 
 - 5print(reversed_evens) 
 - 6 
 - 7==> [0, 2, 4, 6, 8] 
 - 8 [8, 6, 4, 2, 0] 
 
  
也可以用这种方法,把一个列表里的偶数都删掉,只留奇数: 
- 1del elems[::2] 
 - 2print(elems) 
 - 3 
 - 4==> [1, 3, 5, 7, 9] 
 
  
2.3、插入 (Insertion) 
把列表里的其中一个元素的值,换成另一个值。 
- 1elems = list(range(10)) 
 - 2elems[1] = 10 
 - 3print(elems) 
 - 4 
 - 5==> [0, 10, 2, 3, 4, 5, 6, 7, 8, 9] 
 
  
如果想把某个索引处的一个元素,替换成多个元素,比如把 1 换成 20, 30, 40 : 
- 1elems = list(range(10)) 
 - 2elems[1:2] = [20, 30, 40] 
 - 3print(elems) 
 - 4 
 - 5==> [0, 20, 30, 40, 2, 3, 4, 5, 6, 7, 8, 9] 
 
  
如果想把3个值 0.2, 0.3, 0.5 插在索引0和索引1之间: 
- 1elems = list(range(10)) 
 - 2elems[1:1] = [0.2, 0.3, 0.5] 
 - 3print(elems) 
 - 4 
 - 5==> [0, 0.2, 0.3, 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
 
  
2.4、拉平 (Flattening) 
如果,一个列表里的每个元素都是个列表,可以用sum把它拉平: 
- 1list_of_lists = [[1], [2, 3], [4, 5, 6]] 
 - 2sum(list_of_lists, []) 
 - 3 
 - 4==> [1, 2, 3, 4, 5, 6] 
 
  
如果是嵌套列表 (Nested List) 的话,就可以用递归的方法把它拉平。这也是lambda函数又一种优美的使用方法:在创建函数的同一行,就能用上这个函数。 
- 1nested_lists = [[1, 2], [[3, 4], [5, 6], [[7, 8], [9, 10], [[11, [12, 13]]]]]] 
 - 2flatten = lambda x: [y for l in x for y in flatten(l)] if type(x) is list else [x] 
 - 3flatten(nested_lists) 
 - 4 
 - 5# This line of code is from 
 - 6# https://github.com/sahands/python-by-example/blob/master/python-by-example.rst#flattening-lists 
 
  
2.5、列表vs生成器 
要想知道列表和生成器的区别在哪,看个例子:从token列表里面创建n-grams。 
一种方法是用滑窗来创建: 
- 1tokens = ['i', 'want', 'to', 'go', 'to', 'school'] 
 -  2 
 -  3def ngrams(tokens, n): 
 -  4 length = len(tokens) 
 -  5 grams = [] 
 -  6 for i in range(length - n + 1): 
 -  7 grams.append(tokens[i:i+n]) 
 -  8 return grams 
 -  9 
 - 10print(ngrams(tokens, 3)) 
 - 11 
 - 12==> [['i', 'want', 'to'], 
 - 13 ['want', 'to', 'go'], 
 - 14 ['to', 'go', 'to'], 
 - 15 ['go', 'to', 'school']] 
 
  
上面这个例子,是需要把所有n-gram同时储存起来的。如果文本里有m个token,内存需求就是 O(nm) 。m值太大的话,存储就可能成问题。 
所以,不一定要用一个列表储存所有n-gram。可以用一个生成器,在收到指令的时候,生成下一个n-gram,这叫做惰性计算 (Lazy Evaluation) 。                         (编辑:91站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |