#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] соответственно