如何通过给定的分隔符拆分列表中的字符串并展平子字符串列表

How to split strings inside a list by given delimiter and flatten the sub-strings lists

我有一个包含此列表的 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"
]

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

您可以创建一个新列表来保存结果,而不是在循环遍历时修改原始列表:

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

创建一个新列表可能会更容易:

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

split 将 return 一个列表,你不需要检查';'在区块中:

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] ,  [])

您可以通过使用嵌套列表理解表达式来实现:

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

在遍历列表的同时就地编辑列表不是一个好主意。

正如其他答案所说,制作一个新列表。如果您对列表理解感兴趣(并且让您的脑袋有点爆炸),试试这个:

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

输出:

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

只需 join 列表并再次 split

而在Document中,sum不推荐一个列表:

For some use cases, there are good alternatives to sum(). The preferred, fast way to concatenate a sequence of strings is by calling ''.join(sequence). To add floating point values with extended precision, see math.fsum(). To concatenate a series of iterables, consider using itertools.chain().