Поведение функции разделения Python

#python #python-3.x #string #split

Вопрос:

 a = "1)2"
b = ")"
a = a.split(")")
b = b.split(")")
print(a, len(a), b, len(b))
 

ВОЗВРАТ

 ['1', '2'] 2 ['', ''] 2
 

Такое поведение кажется мне действительно странным. Почему пробелы возвращаются только для b , а не a для ?

Комментарии:

1. Когда вы разделяете b на «)», слева или справа от») » ничего нет, поэтому вы получаете пустые строки.

2. Для a у вас есть 1 и 2 вокруг ( . Для b он окружен ничем => Пустой с каждой стороны.

3. Как вы думаете, каким должен быть результат вместо этого и почему? Что, по вашему мнению .split , делает и как, по вашему мнению, он должен обрабатывать случай, когда разделитель появляется в начале или в конце строки? Кроме того, вы пробовали прочитать документацию? Что он сказал тебе об этом?

4. Вы можете увидеть это по-другому: your_separator.join([the split parts]) всегда будет давать вам исходную строку. В b , ваш разделитель соединяет две пустые строки, до и после себя. В a , он присоединяется "1" и "2"

5. Вопросы «почему» не подходят для переполнения стека. Мы можем попытаться объяснить причины, по которым принятое решение может облегчить или усложнить определенные задачи программирования, но это все равно очень субъективно. В конечном счете, рассуждения находятся в головах изобретателей — в данном случае языка Python. По этой причине я голосую за то, чтобы закрыть вопрос как основанный на мнении.

Ответ №1:

Как указывали другие, документированное поведение str.split объясняет ваши результаты. Поскольку вы указываете sep быть ')' , split ищет строки, которые его окружают , и в случае ')' , находит ровно 2 пустые строки (не пробелы). В случае '1)2' , split находит 2 непустые строки ( '1' и '2' ). Обратите внимание, что это поведение распространяется и на другие подобные случаи, см. Ниже. Как вы можете видеть split , при наличии sep , возвращает пустые строки в тех случаях , когда sep они встречаются последовательно, или в начале или в конце строки.

 lst = ['1', ')', '1)', ')2', '1)2', '1)2)', '))', ')1)2)']

for s in lst:
    s_split = s.split(')')
    print(f'"{s}" is split intot{len(s_split)} element(s):t', s_split)
 

С принтами:

 "1" is split into       1 element(s):    ['1']
")" is split into       2 element(s):    ['', '']
"1)" is split into      2 element(s):    ['1', '']
")2" is split into      2 element(s):    ['', '2']
"1)2" is split into     2 element(s):    ['1', '2']
"1)2)" is split into    3 element(s):    ['1', '2', '']
"))" is split into      3 element(s):    ['', '', '']
")1)2)" is split into   4 element(s):    ['', '1', '2', '']
 

Ответ №2:

Это потому, что в первом случае ( встречается с индексом 1,поэтому результатом метода разделения будет [a[0:1], a[2:]]

В то время как в первом случае ( встречается с индексом 0,поэтому разделение вернет [a[0:0], a[0:]]

Если вы все еще в замешательстве, рассмотрите строку s = «(12(3(»

Здесь ( встречается при 3 индексах 0,3 и 5,поэтому метод разделения возвращает [s[0:0], s[0 1:3],s[3 1:5],s[5 1:]]

Примечание: Первый и последний элементы будут иметь вид s[0:i] и s[j:-1] соответственно