Разбиение строки на фиксированное количество элементов

#python #string #list

#python #строка #Список

Вопрос:

Мне нужно разделить строку на две части. Если строка не содержит разделителя, мне нужна вторая строка None . Следующий код работает, но кажется слишком подробным для того, что он делает. Есть ли более элегантный способ сделать это?

 def splitter(item):
    elements = item.split('_')
    first = elements[0]
    if len(elements) == 1:
        elements.append(None)
    second = elements[1]
    return first, second

mylist = ['do_this', 'do_that', 'do_somethingelse', 'stayput', 'sleep']

for item in mylist:
    print(splitter(item))

# Output:
# ('do', 'this')
# ('do', 'that')
# ('do', 'somethingelse')
# ('stayput', None)
# ('sleep', None)

  

Ответ №1:

Ваш код кажется нормальным.

Вы могли бы сделать это :

 def splitter(item, delimiter):
    if delimiter in item:
        return  tuple(item.split(delimiter))
    else:
        return (item, None)

mylist = ['do_this', 'do_that', 'do_somethingelse', 'stayput', 'sleep']

for item in mylist:
    print(splitter(item, "_"))
  

Кстати, вы на 100% уверены, что в ваших строках будет только один «_»?

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

1. Большое спасибо. Я надеялся, что для этого будет однострочный вариант, но ваше предложение короче и намного приятнее, несмотря ни на что. Кстати, да, там только одно подчеркивание.

Ответ №2:

Вы также можете попробовать

 def splitter(item):    
    parts = item.split('_')
    return parts   [None] * (2 - len(parts))

  

Ответ №3:

Вот достаточно простая однострочная строка для каждого элемента в списке:

 mylist = ['do_this', 'do_that', 'do_somethingelse', 'stayput', 'sleep']
for item in mylist:
    item_1, item_2 = item.split('_')[0], item.split('_')[1] if len(item.split('_')) != 1 else None
    print(item_1, item_2)

#Output:
#do this
#do that
#do somethingelse
#stayput None
#sleep None
  

Вот полная однострочная строка для всего списка, которая помещает каждую пару в кортеж в списке:

 newlist = [(item.split('_')[0], item.split('_')[1] if len(item.split('_')) != 1 else None) for item in mylist]

#Output:
#[('do', 'this'), ('do', 'that'), ('do', 'somethingelse'), ('stayput', None), ('sleep', None)]
  

Должно быть достаточно легко изменить их, чтобы выходные данные были в нужном вам формате (список, кортеж и т. Д.).