2016-11-09 2 views
-1

На данный момент у меня есть объект списка, как это:Есть ли способ использовать strip() для объекта списка? - питон

lst = [None, None, 'one', None, 'two', None] 

Я пытаюсь выполнить полосу() на нем и получить результат, как этот:

strip(lst) 

>> ['one', None, 'two'] 

left_strip(lst) 

>> ['one', None, 'two', None] 

Есть ли изящный способ сделать это?

пс: благодаря 4 @ совет woockashek, я уже изменил LST
От [None, None, 'one','two', None] Для [None, None, 'one', None, 'two', None]

+0

Ни одно решение попытка, только вопрос свалка, и это один имеет upvote? Прохладное голосование. – Lafexlos

+1

Непонятно, чего вы хотели бы достичь. Что относительно '[None, 'one', None, 'two', None]'. Вы ожидаете '['one', None, 'two']' или '['one', 'two']'? – woockashek

ответ

5

Чтобы получить поведение как left_strip вам нужно будет импортировать dropwhile из itertools:

>>> lst=[None, None, 'one', None, 'two', None, None] 
>>> from itertools import dropwhile 
>>> def left_strip(lst): 
     return list(dropwhile(lambda x : x is None, lst)) 
>>> left_strip(lst) 
['one',None, 'two', None, None] 

Личное сообщение: Отправить личное сообщение для right_strip

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

>>> left_strip(right_strip(lst)) 
['one', None, 'two'] 
+2

Или 'if item not None 'в случае, если OP хочет сохранить потенциальные нулевые значения. – Maroun

+1

@SebastianWozny Это не вопрос «Pythonic», это просто другое дело. – Maroun

+1

Вы отвечаете за 'strip' неверно. Что делать, если у вас есть «Нет» между «1» и «2»? – Fejs

1

есть метод фильтра:

lst = filter(None, lst) 

Но это будет также удалить значения 0, если они у вас есть в вашем списке

Чтобы это исправить поведение вы должны написать свой собственный метод фильтрации

def FilterNone(arg): 
    return arg is not None 

filtered_list = filter(FilterNone, lst) 
+0

Это неправильный ответ. Что делать, если вы передаете 'lst = [None, 1, None, 2, None]'? – Fejs

+0

Пример не ясен, поэтому я предположил, что эта ситуация никогда не произойдет. Я также спросил о таком примере в посте, но не получил ответа. – woockashek

+0

Если вы знаете, что делает 'string.strip()' does (удаляет пустые пробелы с обоих концов), вы можете предположить, что это желаемое поведение (или курс, вам нужно снять «None» здесь). – Fejs

1

вы можете использовать фильтр так:

lst = [None, None, 'one', 'two', None] 
list(filter(None.__ne__, lst)) 
+0

Этот объект дает атрибут AttributeError: NoneType не имеет атрибута '__ne __' 'на python2.7, так что это, вероятно, решение python3 – woockashek

+0

Это неправильный ответ. Что делать, если вы передаете 'lst = [None, 1, None, 2, None]'? Кроме того, у вас нет решения для 'left_strip'. – Fejs

4

Вы можете использовать itertools.dropwhile эмулировать lstrip:

def lstrip(list): 
    return list(itertools.dropwhile(lambda x : x is None, list)) 

lst = [None, None, 'one', 'two', None] 
lstrip(lst) 
>> ['one', 'two', None] 

rstrip может быть реализован таким же образом, но реверсирования список перед и после использования dropwhile

def rstrip(list): 
    return list(reversed(lstrip(reversed(list)))) 
0

Вы можете попробовать:

def left_strip(lst): 
    for i, e in enumerate(lst): 
     if e is not None: 
      return lst[i:] 
    return [] 


def right_strip(lst): 
    for i, e in reversed(list(enumerate(lst))): 
     if e is not None: 
      return lst[:i+1] 
    return [] 

print left_strip(right_strip(lst)) 

Вы можете прочитать в remove None value from a list without removing the 0 value

+1

Во-первых, у вас нет ответа для второй функции ('left_strip'). Во-вторых, этот ответ неверен. Что делать, если у вас есть «Нет» между «1» и «2»? – Fejs

+0

Хорошая точка. Исправлена. – daniboy000

0

Не получить то, что вы на самом деле хотите сделать? Вы можете использовать lst [2: 4] и lst [2:].

Update: использование установить

, если вы хотите иметь только значения, которые не являются «None», то вы не используете набор, как показано:

lst = [None, None, 'one', 'two', None] 
lst1=[None] 
print list(set(lst)-set(lst1)) 
+0

Этот ответ неверен, если у вас нет именно этого ввода. Это ужасное предположение. – Fejs

+0

@Fejs Я указал, что непонятно, что спрошено. Ответ основан на предположении о левой полосе. – Biswal

0

Один из способов сделать это:

def right_strip(lst): 
    for i in range(len(lst) - 1, -1, -1): 
     if lst[i] != None: 
      break 
    else: 
     return [] 
    return lst[:i + 1] 

def left_strip(lst): 
    for i in range(len(lst)): 
     if lst[i] != None: 
      break 
    else: 
     return [] 
    return lst[i:] 

def strip(lst): 
    return left_strip(right_strip(lst)) 
1

Вот естественный left_strip():

def left_strip(items): 
    for i,x in enumerate(items): 
     if x is not None: return items[i:] 
    return [] #in case all are None 

Например,

>>> left_strip(lst) 
['one', 'two', None] 
+1

Что делать, если вы передаете пустой список или список содержит только «Нет»? – Fejs

+0

@Fejs Хорошая добыча. Исправлена. –

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