2017-01-17 3 views
0

У меня есть питон скрипт с этим списком:Как разбить строку внутри списка и сгладить список подстрок?

blocks = [ 
    "item-1", 
    "item-2", 
    "item-3.0;item-3.1;item-3.2" 
] 

Я попытался это:

for (i, block) in enumerate(blocks): 
    if ";" in block: 
    [blocks.insert(i, c) for c in block.split(";")] 
    else: 
    blocks.insert(i, block) 

Чтобы получить это:

blocks = [ 
    "item-1", 
    "item-2", 
    "item-3.0", 
    "item-3.1", 
    "item-3.2" 
] 

К сожалению, мой код сохраняет перезапись элементы в список, и я остаюсь с этим:

blocks = [ 
    "item-1", 
    "item-2", 
    "item-3.2" 
] 

Как я могу изменить сценарий, чтобы разрешить разбиение строки внутри списка, а затем вставить новые подстроки в позицию исходной строки без перезаписи других элементов в списке?

+0

Почему нет нового списка, добавьте их все в новый список. – Arman

ответ

4

Было бы легче сделать новый список:

blocks = [ 
    "item-1", 
    "item-2", 
    "item-3.0;item-3.1;item-3.2" 
] 

new_blocks = [] 

for block in blocks: 
    for c in block.split(";"): 
     new_blocks.append(c) 

# new_blocks = ['item-1', 'item-2', 'item-3.0', 'item-3.1', 'item-3.2'] 
+1

вам больше не нужно 'i' или' enumerate'. – dabadaba

2

Вы можете создать новый список для хранения результатов, а не изменять исходный список в то время как цикл через него:

result = [] 
for block in blocks: 
    result.extend(block.split(";")) 

result 
# ['item-1', 'item-2', 'item-3.0', 'item-3.1', 'item-3.2'] 

Вдохновленный @ ответ Jblasco, вы можете также использовать chain:

from itertools import chain 
list(chain.from_iterable(block.split(';') for block in blocks)) 

# ['item-1', 'item-2', 'item-3.0', 'item-3.1', 'item-3.2'] 
4

split будет возвращать список, вам не нужно проверять, есть ли ';' находится в блоке:

In [34]: [ii.split(';') for ii in blocks] 
Out[34]: [['item-1'], ['item-2'], ['item-3.0', 'item-3.1', 'item-3.2']] 

Итак, теперь вам нужно только добавить весь список вместе с суммой функций.

sum([ii.split(';') for ii in blocks] , []) 
1

Вы можете добиться этого с помощью использования вложенного список постижения выражения:

blocks = [ 
    "item-1", 
    "item-2", 
    "item-3.0;item-3.1;item-3.2" 
] 

my_list = [a for b in blocks for a in b.split(';')] 

где держать содержание по my_list будет:

['item-1', 'item-2', 'item-3.0', 'item-3.1', 'item-3.2'] 
0

в месте редактирования списков в то время как итерация это не очень хорошая идея.

Как утверждают другие ответы, создайте новый список. Если вы в списковых (и сделать вашу голову взорваться немного), попробуйте следующее:

blocks = [ 
    "item-1", 
    "item-2", 
    "item-3.0;item-3.1;item-3.2" 
] 
[substr for block in blocks for substr in block.split(';')] 
0
';'.join(blocks).split(';') 

аут:

['item-1', 'item-2', 'item-3.0', 'item-3.1', 'item-3.2'] 

Просто join список вместе и split снова.

И в Document, sum список не рекомендуется:

Для некоторых случаев применения, есть хорошие альтернативы SUM(). Предпочтительный, быстрый способ конкатенации последовательности строк предпочтительнее: '' .join (последовательность). Чтобы добавить значения с плавающей запятой с расширенной точностью , см. Math.fsum(). Чтобы объединить ряд итераций, рассмотрите возможность использования itertools.chain().

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