У меня есть эти строки в Python:
a=['One','one_two','one_two_three','one_two_three_four']
И мне нужно получить две первые части (разделение на основе «_»).
Я могу написать что-то вроде этого:
for c in a:
x=c.split("_", 2)
if (len(x)>=2):
y=x[0]+'_'+x[1]
else:
y=x[0]
print(y)
Но есть ли лучший способ сделать это?
Вы можете улучшить if, просто собрав первые 2 ([:2]) из split(), а затем join() их снова вместе:
a=['One','one_two','one_two_three','one_two_three_four']
for c in a:
x=c.split("_")[:2]
y='_'.join(x)
print(y)
# One-liner variant
# [ print('_'.join(c.split("_")[:2])) for c in a ]
One
one_two
one_two
one_two
Вот способ, который использует find() и не полагается на split(), что будет более эффективным, поскольку части снова соединяются таким образом, что обратный эффект split():
for c in a:
i = c.find('_')
if i != -1:
i = c.find('_', i + 1)
y = c if i == -1 else c[:i]
print(y)
Выход:
One
one_two
one_two
one_two
Вот однострочник, использующий понимание списка:
['_'.join(c.split('_')[:2]) for c in a]
Он разбивает строку относительно «_», берет не более 2 сегментов и соединяет их обратно, помещая «_» между ними. Имейте в виду, что это возвращает обработанный список, поэтому вам все равно нужно его распечатать.
Вы также можете сделать это, используя аргумент sep для print() следующим образом:
a = ['One', 'one_two', 'one_two_three', 'one_two_three_four']
for c in a:
print(*c.split('_')[:2], sep='_')
Выход:
One
one_two
one_two
one_two
Умное решение, не знаю, почему за него проголосовали...
Вам не нужен второй аргумент для split()