2014-12-13 3 views
4

У меня есть список вроде следующегоРегистрация элементов в списке питона разделены разделителем

list_1 = ['>name', 'aaa', 'bbb', '>name_1', 'ccc', '>name_2', 'ddd', 'eee', 'fff'] 

Я пытался соединить детали между элементами с «знаком«> Так что я хочу:

list_1 = ['>name', 'aaabbb', '>name_1', 'ccc', '>name_2', 'dddeeefff'] 

Как я могу сделать это в Python

ответ

5

Используйте функцию генератора, что позволяет контролировать, когда элементы «сделано», чтобы получить:

def join_unescaped(it): 
    tojoin = [] 
    for element in it: 
     if element.startswith('>'): 
      if tojoin: 
       yield ''.join(tojoin) 
       tojoin = [] 
      yield element 
     else: 
      tojoin.append(element) 
    if tojoin: 
     yield ''.join(tojoin) 

Чтобы создать новый список, то из вашего входа, передать объект генератора производится в list() функции:

result = list(join_unescaped(list_1)) 

Демо:

>>> list_1 = ['>name', 'aaa', 'bbb', '>name_1', 'ccc', '>name_2', 'ddd', 'eee', 'fff'] 
>>> def join_unescaped(it): 
...  tojoin = [] 
...  for element in it: 
...   if element.startswith('>'): 
...    if tojoin: 
...     yield ''.join(tojoin) 
...     tojoin = [] 
...    yield element 
...   else: 
...    tojoin.append(element) 
...  if tojoin: 
...   yield ''.join(tojoin) 
... 
>>> list(join_unescaped(list_1)) 
['>name', 'aaabbb', '>name_1', 'ccc', '>name_2', 'dddeeefff'] 
+0

Я бы использовал 'str.startswith', я думаю. – thefourtheye

+0

@thefourtheye: для теста с 1 символом мне легче использовать 1-значный фрагмент. Я обновлю, так как это может быть просто яснее. –

+0

@ thefourtheye: срез быстрее (вызов метода не требует поиска атрибута и т. Д.), А для теста с фиксированной длиной так же просто. 'str.startswith()' начинает светить, когда вход в метод является динамическим или кортежем. –

5
>>> from itertools import groupby 
>>> list_1 = ['>name', 'aaa', 'bbb', '>name_1', 'ccc', '>name_2', 'ddd', 'eee', 'fff'] 
>>> [''.join(v) for k, v in groupby(list_1, key=lambda s: s.startswith('>'))] 
['>name', 'aaabbb', '>name_1', 'ccc', '>name_2', 'dddeeefff'] 

Единственный случай, чтобы наблюдать за вот если у вас нет предметов между знаками >, для которых требуется простое исправление.

>>> list_1 = ['>name', '>name0', 'aaa', 'bbb', '>name_1', 'ccc', '>name_2', 'ddd', 'eee', 'fff'] 
>>> [''.join(v) for k,v in groupby(list_1,key=lambda s:s.startswith('>')and s)] 
['>name', '>name0', 'aaabbb', '>name_1', 'ccc', '>name_2', 'dddeeefff'] 

Sub Примечание: только в крайне маловероятном случае, что вы можете иметь дубликаты >name сек как ['>name', '>name', 'aaa'....] просто изменить and s к and object() (который является уникальным) и который обрабатывает все возможные случаи

Смежные вопросы