如何在列表中拆分字符串并展平子字符串列表?

时间:2017-01-17 14:59:21

标签: python string list python-3.x flatten

我有一个包含此列表的python脚本:

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"
]

如何修改脚本以允许我在列表中拆分字符串,然后将新的子字符串插入原始字符串的位置而不覆盖列表中的其他元素?

6 个答案:

答案 0 :(得分: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 :(得分:4)

拆分将返回一个列表,你不需要检查';'在街区:

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

所以现在你唯一需要的是将所有列表添加到函数sum中。

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

答案 2 :(得分: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']

答案 3 :(得分: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']

答案 4 :(得分: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(';')]

答案 5 :(得分:0)

';'.join(blocks).split(';')

出:

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

只需join列表{}再次split

Documentsum中不建议使用列表:

  

对于某些用例,sum()有很好的替代方法。该   首选,快速连接字符串序列的方法是通过调用   ''。加入(序列)。要使用扩展名添加浮点值   精度,请参见math.fsum()。 连接一系列迭代,   考虑使用itertools.chain()