2017-01-11 3 views
0
[['user_1', 
    'user_2', 
    'user_8', 
    None, 
    None], 
['ben', 
    'karl', 
    None, 
    None]] 

Я стараюсь, чтобы удалить недостающие значенияудалить из списка отсутствующих значений None

for element in df: 
    element=[x for x in element if x is not None] 

этот код оставить все, как было

+0

Вы можете использовать [** 'filter' **] (https://docs.python.org/2/library/functions.html#filter), хотя это также удалит пустые строки, нули и т. Д. –

+1

Вы может найти эту статью полезной: [Факты и мифы о именах и ценностях Python] (http://nedbatchelder.com/text/names.html), который был написан ветеран SO Нед Батчелдер .. И вот конденсированная версия того же info, с симпатичными диаграммами: [Другие языки имеют «переменные», у Python есть «имена»] (http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have- переменные) –

+0

FWIW, ни один из ответов в этом объекте dupe не показывает, как изменить существующий список (или его подписок), а не заменить его. –

ответ

1

проблема с кодом является то, что линии

element=[x for x in element if x is not None] 

создает новый отфильтрованный список и связывает его с именем element, которое заменяет старый объект списка, к которому привязано имя element. Но мы можем использовать назначение ломтика, чтобы сделать его мутировать этот список вместо:

df = [ 
    [ 
     'user_1', 
     'user_2', 
     'user_8', 
     None, 
     None, 
    ], 
    [ 
     'ben', 
     'karl', 
     None, 
     None, 
    ] 
] 

# Remove the `None` values 
for element in df: 
    element[:] = [x for x in element if x is not None] 

for row in df: 
    print(row) 

выход

['user_1', 'user_2', 'user_8'] 
['ben', 'karl'] 
0

Переназначение element не изменяет список, потому что element является отдельную переменную.

С небольшим изменением, вы можете создать новый внешний список, используя вложенную понимание, что-то вроде этого:

df = [[x for x in element if x is not None] for element in df] 
1
my_list= [['user_1', 
    'user_2', 
    'user_8', 
    None, 
    None], 
['ben', 
    'karl', 
    None, 
    None]] 

print [ [ elt for elt in a_list if elt is not None ] for a_list in my_list ] 

[[ 'user_1', 'user_2', 'user_8' ], [ 'бен', 'Карлу']]

+2

Это также удалит элементы списка с '0' в них ... –

+0

@ l'L'l right, fixed. – YOBA

+0

Это нормально, если 'len (my_list)' мал, но если он огромен, вероятно, желательно сохранить RAM, изменив существующий список, а не заменив его. OTOH, заменяя 'my_list' _is_ немного быстрее, чем мутировать его. –

1
for element in df: 
    element[:]=[x for x in element if x is not None] 

из:

[['user_1', 'user_2', 'user_8'], ['ben', 'karl']] 

Document: enter image description here

Смежные вопросы