Функция добавления истинного или ложного не работает правильно - PullRequest
0 голосов
/ 10 февраля 2019

Я составляю список:

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

Для этого я попробовал функцию, которая сохраняет в список True, если длина списка равна 0, и False в противном случае.

Затем я использую itertools.com, чтобынапечатать элементы, селекторы которых имеют значение 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, но должно быть 3 раза и еще один False после второго True.

Почему это и как исправить?Есть ли более быстрый / лучший способ решить всю проблему?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Проблема в отсутствии else: - см. ответ Хиро - к нему всегда добавляется False.


Дзен питона: # 3 - Простое лучше, чем сложное.

Вам не нужно itertools.compress вообще:

zip_nest_list = list(zip(range(len(nest_list)),nest_list))

аналогично:

zip_nest_list = list(enumerate(nest_list))

Чтобы получить индексы пустого списка, вы можете использовать понимание списка :

empties = [ x for x in enumerate(nest_list) if not x[1]] # empty list is Falsy

print( *empties, sep="\n")

Вывод:

(4, [])
(8, [])

Доку:

0 голосов
/ 10 февраля 2019

вы забыли предложение else в вашем выражении if;False добавляется к selectors в любом случае.должно быть:

if len(zip_nest_list[i][1]) == 0:
    selectors.append(True)
else:
    selectors.append(False)
...