Python 之嵌套列表
????????嵌套(nest),顧名思義,我中有你,你在我中之意。嵌套是 Python 語言中常見的現象,有函數嵌套,循環嵌套,可迭代對象嵌套等,具體到標題,即指列表中嵌套有列表,形如:
例 1
>>> info = [['張三', 'M', '45'], ['李四', 'F', '36'], ['王五', 'M', '42']] >>> print(info) [['張三', 'M', '45'], ['李四', 'F', '36'], ['王五', 'M', '42']]????????類似的還有列表嵌套字典,字典嵌套字典,字典嵌套列表等,操作方法相近,本文以嵌套列表為例。
索引
????????與列表索引一致,嵌套列表索引的語法為:
list_name[index1][index2][...]????????其中,index1 為目標元素所在子列表,index2 為子列表中的目標元素,以此類推……
如提取例 1 中李四的年齡信息:
>>> info[1][2] '36'排序
????????同列表排序,如例 1 按年齡降序排列:
>>> info.sort(key = lambda x: x[2], reverse = True) >>> info [['張三', 'M', '45'], ['王五', 'M', '42'], ['李四', 'F', '36']]詳見:Python 函數 sort(),sorted() 之區別及 key=lambda x:x[] 之理解數據排序https://blog.csdn.net/iprobobo/article/details/122713695
去重
????????關于嵌套列表中對象的去重,需要注意的是,因為嵌套列表為非哈希類型,不能利用集合的去重特性:
例 2
>>> l = [['a', 'b'], ['c', 'd']] >>> hash(l) Traceback (most recent call last):File "<pyshell#66>", line 1, in <module>hash(l) TypeError: unhashable type: 'list'????????若要去重且保持原順序,可通過列表元素的取出(list.pop())和插入(list.insert())遍歷實現(感謝 技術專家團-Plio大咸魚?的指導):
例 3?
l = [['百度', 'BD'], ['京東', 'JD'], ['淘寶', 'TB'], ['百度', 'BD']] L = [] while(l):pop_l = l.pop()if pop_l in l:continueelse:L.insert(0, pop_l) print(L)????????運行結果:
[['百度', 'BD'], ['京東', 'JD'], ['淘寶', 'TB']]????????若是復雜的多層嵌套,可借助自定義函數遞歸:
例 4
l = [['百度', 'BD'], ['京東', 'JD'], [['百度', 'BD'], ['淘寶', 'TB']]] L = [] def f(l, L): while(l):pop_l = l.pop()if type(pop_l[0]) == list:f(pop_l, L)else:if pop_l in L:continueelse:L.insert(-1, pop_l)f(l, L) print(L)?運行結果:
[['百度', 'BD'], ['京東', 'JD'], ['淘寶', 'TB']]展平
????????將單層嵌套列表展平為非嵌套列表,可借助列表 extend() 函數:
例 5
l = [['a', 'b'], ['c', 'd']] L = [] for i in l:L.extend(i) print(L)????????運行結果:
['a', 'b', 'c', 'd']????????或借助列表推導式:
例 6
>>> l = [[1, 2], [3, 4, 5], [6, 7], [8], [9]] >>> L = [x for y in l for x in y] >>> L [1, 2, 3, 4, 5, 6, 7, 8, 9]????????對于復雜的多層嵌套列表,可借助遞歸:
例 7
l = [1, [2], [[3]], [[4, [5]], 6]] L = []def f(l, L): for i in l:if isinstance(i, list):f(i,L)else:L.append(i)f(l,L) print(L)運行結果:
[1, 2, 3, 4, 5, 6]????????也可以利用生成器來迭代:
例 8
def f(x):for i in x:if isinstance(i, list):yield from f(i)else:yield il = [[4, [2, 3], [[[7], 5]], [[[9, [1]]], 8], 6]] L = [x for x in f(l)]print(sorted(L))運行結果:
[1, 2, 3, 4, 5, 6, 7, 8, 9]附:
列表嵌套字典
????????在列表中嵌套字典為常用的方式:
例 9
l = [{'a': 3}, {'b': 2}, {'c': 1}] L = []for i in range(len(l)):for j in l[i].items():L.append(j)print(L)運行結果:
[('a', 3), ('b', 2), ('c', 1)]字典嵌套字典
????????此時字符串為 key,嵌套的字典為 value:
>>> d = {'a':{'b':'Yes','c':{'d':{'e': 'or', 'f': 'No'}}},'g':{}} >>> d['a']['c']['d']['f'] 'No'字典嵌套列表
????????字符串為 key,嵌套的列表為value:
>>> d = {'水果':['西瓜','榴蓮','芒果'],'動物':['獅子','藍鯨','螞蟻'] }>>> print(d['水果'][1]) 榴蓮>>> for k, v in d.items():print('\n', k, end = ':')for i in v:print(i, end = ' ')水果:西瓜 榴蓮 芒果 動物:獅子 藍鯨 螞蟻……
注:
1、關于序列的更多知識總結,請參見:Python 序列之三言兩語序列是具有先后關系的一組元素...https://blog.csdn.net/iprobobo/article/details/122542937
2、關于列表推導式,請參見:Python 之推導式常用的語法糖https://blog.csdn.net/iprobobo/article/details/123582135?3、關于字典,請參見:Python 字典之演義映射無處不在,鍵值對無處不在。https://blog.csdn.net/iprobobo/article/details/122668767
總結
以上是生活随笔為你收集整理的Python 之嵌套列表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java widget_Java Fav
- 下一篇: 【转载】python 函数的入参 一个*