Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何按给定的分隔符拆分列表中的字符串并展平子字符串列表_Python_String_List_Flatten - Fatal编程技术网

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

Python 如何按给定的分隔符拆分列表中的字符串并展平子字符串列表,python,string,list,flatten,Python,String,List,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) 要获得此信息:

我有一个包含以下列表的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:


制作一个新的列表可能会更容易:

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将返回一个列表,您不需要检查“;”在街区内:

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_列表中包含的内容将是:


在迭代时就地编辑列表不是一个好主意

正如其他答案所说,列一个新的清单。如果你对列表的理解有兴趣,并且让你的脑袋有点爆炸,试试以下方法:

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

只需将列表连接在一起,然后再次拆分

在总结中,不建议列出:

对于某些用例,sum有很好的替代方案。这个 连接字符串序列的首选快速方法是调用 .连接顺序。使用扩展名添加浮点值的步骤 精度,参见math.fsum。要连接一系列的可重用项, 考虑使用ItdioStudio.Calp.


为什么没有一个新的列表,把它们都添加到一个新的列表中。你甚至不需要我也不需要在这里枚举。
['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']