LINUX.ORG.RU

Python: как проще всего закинуть «one two three four» в список как строки без пробелов по краям?


0

1

Наименее короткий код, который получается на моей квалификации питона:

result = []
s = "one   two three             four"
lst = s.split()
for name in lst:
    tmpn = name.strip()
    if len( tmpn ) > 0:
       result.append( tmpn )

Без проверки длины каждого элемента списка s.strip() можно получить пустые элементы вследствие разбиения последовательности пробелов на «межпробельные строки нулевой длины».

А короче как? Где мастера хардкора с функторами, лямбдами и прочими рулезами?

>>> s = "one   two three             four"
>>> s.split()
['one', 'two', 'three', 'four']
$ python -V
Python 2.7.3

Т.е. split() отлично обрабатывает пробелы по краям. Если у тебя остаются пустые строки, значит в них что-то другое, выясни что и замени на обычный пробел.

Из мана: «If sep is not specified or is None, any whitespace string is a separator and empty strings are removed from the result».

vden ★★
()

Эрланг, без функторов и лямбд, но с паттерн матчингом!

strip(Str) -> f(Str, [], []).

f([], A, []) -> A;

f([], A, C) -> A ++ [C];

f([$ |T], A, []) -> f(T, A, []);

f([$ |T], A, C) -> f(T, [C]++A, []);

f([H|T], A, C) -> f(T, A, C++[H]).

anonymous
()

с функторами, лямбдами и прочими рулезами?

>>> from itertools import groupby
>>> s = "one   two three             four"
>>> [''.join(it) for key, it in groupby(s, key=lambda c: getattr(c, 'isspace')()) if key is False]

['one', 'two', 'three', 'four']
Belkrr
()

В «if» можешь вставить любые проверки, какие хочешь.

$ python
>>> s = "one   two three             four"
>>> result = [x for x in s.split() if x]

justAmoment ★★★★★
()

Где же автор. Ответь уже на первый пост.

anonymous
()
Ответ на: комментарий от vden

+1 Это у меня C++ - boost::tokenizer - овское мышление работает.

kiverattes ★☆
() автор топика
Ответ на: комментарий от Relan

А в питоне это просто ['one', 'two', 'three', 'four'], ага.

anonymous
()
>>> a = 'one two three four             '
>>> map(lambda x: x.strip(), a.split())
['one', 'two', 'three', 'four']

мэпа не было еще, это надо исправить.

xpahos ★★★★★
()

c++

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>

int main() {
    using namespace std;
    string sentence = "  one   two three             four ";
    istringstream iss(sentence);

    vector<string> tokens;
    copy(istream_iterator<string>(iss),
         istream_iterator<string>(),
         back_inserter<vector<string> >(tokens));
}
bhfq ★★★★★
()
Ответ на: комментарий от true_admin

капитан? :)

пример выше не нуждается в проверке длинны и в strip

xpahos ★★★★★
()
Ответ на: комментарий от Cy6erBr4in

Говно-пример! Трушные примеры на функциональных языках должны быть от анонимусов и выглядеть так, чтоб кровь из глаз!

cdshines ★★★★★
()
Ответ на: комментарий от cdshines
s = "one   two three             four"
print [s[v:(s + ' ').index(' ', v)] for v, i in enumerate(s) if not(' ' in i or ''.join([' ', s])[v] != ' ')]
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.