2014-02-08 2 views
3

Если у меня есть данные, хранящиеся в списке, например.Как разбить элемент списка на два?

images = ['pdf-one','gif-two','jpg-three'] 

Как расколоть их на несколько элементов в дефис - не подписок. То есть

images = ['pdf','-one','gif','-two','jpg','-three'] 

не

images = [['pdf','-one'],['gif','-two'],['jpg','-three']] 
+0

В том числе дефиса? –

+0

Да, ему нужно распознать дефис, и оттуда оттуда оттуда оттуда –

+1

Что произойдет, если есть несколько дефисов? –

ответ

5

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

import re 

hyphensplit = re.compile('(-[a-z]+)').split 
images = [part for img in images for part in hyphensplit(img) if part] 

Демо:

>>> import re 
>>> hyphensplit = re.compile('(-[a-z]+)').split 
>>> images = ['pdf-one','gif-two','jpg-three'] 
>>> [part for img in images for part in hyphensplit(img) if part] 
['pdf', '-one', 'gif', '-two', 'jpg', '-three'] 
4

Вы можете использовать str.partition для это:

>>> from itertools import chain 
>>> images = ['pdf-one', 'gif-two', 'jpg-three'] 
>>> list(chain.from_iterable([[a, b+c] for a, b, c 
              in (x.partition('-') for x in images)])) 
['pdf', '-one', 'gif', '-two', 'jpg', '-three'] 

Использование функции генератора для более читаемым решения:

def my_split(seq): 
    for item in seq: 
     a, b, c = item.partition('-') 
     yield a 
     yield b+c 

>>> list(my_split(images)) 
['pdf', '-one', 'gif', '-two', 'jpg', '-three'] 
Смежные вопросы