列表推导表达式显示无值而不是子列表

时间:2014-01-30 04:32:46

标签: python list list-comprehension

我正在学习列表理解并且它非常快,但我试图将该值插入子列表,并且它显示该子列表的None。我正在尝试这里,

def tester(lst):
      print [ x if x%2 else x*100 for x in range(1, 10) ] # It is working
      #output: [1, 200, 3, 400, 5, 600, 7, 800, 9]
      print [ls.insert(2,"Null") for ls in lst]
      #output: [None, None]


lst = [['a','c','d'],['1','2','3']]

tester(lst)

为何显示[None, None]?以及为什么它没有显示[['a','c','d', 'Null'],['1','2','3', 'Null']]

1 个答案:

答案 0 :(得分:2)

list.insert就地修改列表并返回None

>>> lis = range(5)
>>> repr(lis.insert(2, 'null')) # returns None
'None'
>>> lis                         # But the list is affected.
[0, 1, 'null', 2, 3, 4]

在这里使用简单的for循环:

for ls in lst:
    ls.insert(2, "Null") 

你也可以使用列表理解,但我更喜欢正常的循环版本:

>>> lst = [range(5) for _ in range(5)]
>>> [ls for ls in lst if not ls.insert(2, 'null')]
[[0, 1, 'null', 2, 3, 4], [0, 1, 'null', 2, 3, 4], [0, 1, 'null', 2, 3, 4], [0, 1, 'null', 2, 3, 4], [0, 1, 'null', 2, 3, 4]]

此处检查if条件时,项目将插入当前列表,而当list.insert返回None时,not None始终为True

<强>更新

根据您需要使用三元表达式的条件更新列表对象:

>>> lst = [['a','c','d'],['1','2','3'], [1, 2, 3, 4]]
>>> [ls if (len(ls) == 3 and not ls.insert(2, 'null')) else ls for ls in lst]
[['a', 'c', 'null', 'd'], ['1', '2', 'null', '3'], [1, 2, 3, 4]]