2017-02-14 10 views
1

Почему str.split() удаляет элементы Noney, а str.split ('') - нет?Почему str.split() удаляет элементы Noney, а str.split ('') - нет?

>>> s = 'this is an irritating string with random spacing .' 
>>> s.strip().split(' ') 
['this', 'is', '', '', 'an', '', '', 'irritating', 'string', 'with', '', 'random', 'spacing', '', '.'] 
>>> s.strip().split() 
['this', 'is', 'an', 'irritating', 'string', 'with', 'random', 'spacing', '.'] 

Согласно docs:

str.split (SEP = нет, maxsplit = -1)

Если Сентябрем дается, последовательные разделители не сгруппированы вместе и считаются разграниченными пустыми строками (например, '1,, 2'.split (', ') возвращает [' 1 ',' ',' 2 ']). Аргумент sep может состоять из нескольких символов (например, '1 <> 2 <> 3'.split (' <> ') возвращает [' 1 ',' 2 ',' 3 ']). Разделение пустой строки с указанным разделителем возвращает [''].

Если sep не указан или None, применяется другой алгоритм расщепления: пробежки последовательных пробелов рассматриваются как один разделитель, и результат не будет содержать пустых строк в начале или конце, если строка имеет ведущие или конечный пробел. Следовательно, разделение пустой строки или строки, состоящей из просто пробела с разделителем None, возвращает [].

Так использовать аргумент ключевого слова sep=, является следующим за вещий способ удалить элементы Noney?

[w for w in s.strip().split(' ') if w] 

Если это только пробельные символы (\s\t\n), str.split() будет достаточно, но позволяет сказать, что мы пытаемся разделить на другой персонаж/подстроке, то если условие в списке понимании необходимо. Это правильно?

+0

Ни один не является символом пробела. Я даже не знаю, что означает Noney, но метод работает как задокументированный. У вас нет элементов None в строке –

+2

Почему бы просто не использовать 'split()'? Более того, что вы на самом деле пытаетесь сделать? –

+0

Примечание: если вы используете 'split' без аргумента, вызов' strip' сначала является избыточным; 'split' уже удалит ведущее и конечное пустое пространство без добавления дополнительного вызова метода и временной' str'. – ShadowRanger

ответ

1

Если вы хотите быть тупым, вы можете использовать filter(None, x) для удаления элементов falsey:

>>> list(filter(None, '1,2,,3,'.split(','))) 
['1', '2', '3'] 

Вероятно менее Pythonic. Это может быть яснее перебрать элементы конкретно:

for w in '1,2,,3,'.split(','): 
    if w: 
     … 

Это ясно показывает, что вы пропуская пустые элементы, а не полагаться на то, что str.split иногда пропускает пустые элементы.

я как только использовать регулярное выражение, либо пропустить последовательные прогоны сепаратора (но следите за конец):

>>> re.split(r',+', '1,2,,3,') 
['1', '2', '3', ''] 

или найти все, что это не разделитель:

>>> re.findall(r'[^,]+', '1,2,,3,') 
['1', '2', '3'] 

Если вы хотите пойти стороннюю назад в истории Пайтона, были две отдельные функции, split и splitfields. Я думаю, что название объясняет цель. Первый разбивается на любые пробелы, полезные для произвольного ввода текста, а второй ведет себя предсказуемо на каком-то ограниченном входе. Они были реализованы на чистом Python до версии 1.6.

0

Ну, я думаю, вам может понадобиться рука в понимании документации. В вашем примере вы в значительной степени демонстрируете различия в алгоритме, упомянутом в документации.Не использовать аргумент ключевого слова sep более или менее похож на использование sep=' ', а затем выкидывает пустые строки. Когда у вас есть несколько пробелов подряд, алгоритм разбивает их и находит None. Поскольку вы были явно уверены, что хотите, чтобы все было разделено пробелом, оно преобразует None в пустую строку. Изменение None на пустую строку - хорошая практика в этом случае, поскольку она позволяет избежать изменения сигнатуры функции (или, другими словами, функций, возвращаемых функциями), в этом случае она возвращает список строк.

Ниже показано, как пустая строка с 4 пробелов трактуется по-разному ...

>>> empty = ' ' 
>>> s = 'this is an irritating string with random spacing .' 
>>> empty.split() 
[] 
>>> empty.split(' ') 
['', '', '', ''] 

Для вас вопрос, просто использовать split(), без sep аргумента

-1

а ваши строки S = «это представляет собой раздражающую строку со случайным интервалом. ', , который содержит более одного белого пространства, поэтому empty.split (' ') возвращает стоимость нони.

Вам нужно будет удалить лишнее пустое пространство из строки s и получить желаемый результат.

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

  • Нет связанных вопросов^_^