我列出一个清单:
nest_list = [['John like to play football'],['He likes Liverpool'],
['His favourite player is Salah'],['He would like to play as striker'],
[],['James like to play F1'],['He likes Ferrari'],
['His favourite driver is Raikkonnen'],[],
['Stefani like to play basketball'],['She likes Chicago Bulls'],
['His favourite player is Micheal Jordan']]
我想找到空列表的位置并迭代它们以获取有关每个人的信息并将其存储为数据帧。例如:
Row 1: John Football Liverpool Salah Striker
Row 2: James F1 Ferrari Raikkonen Driver
Column: John James etc
为此,我尝试了当列表长度为0时保存列表True
的函数,否则为False
。
然后我使用itertools.compress打印选择器为True的项目。
zip_nest_list = list(zip(range(len(nest_list)),nest_list))
import itertools
selectors = []
def is_empty(i):
'''Create selectors list with True when empty list and false when not empty'''
if len(zip_nest_list[i][1]) == 0:
selectors.append(True)
selectors.append(False)
for x in range(len(zip_nest_list)):
is_empty(x)
result = itertools.compress(zip_nest_list,selectors)
#printing empty lists with number
for item in result:
print(item)
问题是选择器有更多的元素,然后我预期(14而不是12)。在True
和下一个True
之间,我有4次False
,但应该是第二次False
后3次和一次额外的True
。
为什么这样以及如何修复它?有没有更快/更好的方法来解决整个问题?
你在else
声明中忘记了if
条款;无论如何,False
附加到selectors
。它应该是:
if len(zip_nest_list[i][1]) == 0:
selectors.append(True)
else:
selectors.append(False)
问题是缺少else:
- 请参阅hiro's answer - 它总是附加False
。
Zen of python: #3 - 简单比复杂更好。
你根本不需要itertools.compress:
zip_nest_list = list(zip(range(len(nest_list)),nest_list))
是相同的:
zip_nest_list = list(enumerate(nest_list))
要获取空列表的索引,您可以使用list comprehension:
empties = [ x for x in enumerate(nest_list) if not x[1]] # empty list is Falsy
print( *empties, sep="\n")
输出:
(4, [])
(8, [])
质地: