首页 > 解决方案 > 在每个其他元素列表理解之后在 Python 列表中插入元素

问题描述

目标是在列表中除最后一个元素之外的每个其他元素之后插入一个字符串:

arr0 = ['aa','bb','cc','dd']

目标

 ['aa','XX','bb', 'XX','cc','XX','dd']

这个主题已经在这样的帖子中讨论过但是使用的字符串列表只有一个字符的长度,这会影响列表的理解。我没有足够的声誉点来发表评论并要求澄清。

我已经使用 for 循环实现了它,但我正在尝试使用列表理解进行练习,并希望了解我在哪里出错了。目前正在获得一个SyntaxError: invalid syntax.

示例和当前实现

arr0 = ['aa','bb','cc','dd'] # Goal ['aa','XX','bb', 'XX','cc','XX','dd']

# Stop for range
total = len(arr0)*2-1

for i in range(1, total, 2):
   arr0.insert(i, "XX")

# Returns ['aa', 'XX', 'bb', 'XX', 'cc', 'XX', 'dd']

列表理解尝试:

[el for y in [[el, 'XX'] if idx != len(arr0)-1 else el for idx, el in enumerate(arr0)] for el in y if isinstance(y, list) else el]
分解
[[el, 'XX'] if idx != len(arr0)-1 else el for idx, el in enumerate(arr0)]

# Returns
# [['aa', 'XX'], ['bb', 'XX'], ['cc', 'XX'], 'dd']

在外部理解中,我试图将其作为单个字符串列表返回。我试图用来isinstance检查元素是否为列表(最后一项是字符串),如果不是则仅返回字符串。

编辑

我非常感谢您的回复。我应该包括我确实遇到的这种替代情况,即我不希望在末尾的“Note”元素之后插入元素,在这种情况下我无法执行切片。是否可以通过一个步骤进行负索引?

# Alternative scenario
arr1 = ['aa','bb','cc','dd', 'Note']

# ['aa','XX,'bb','XX,'cc','XX,'dd','Note']

标签: pythonfor-loopnestedlist-comprehensionnested-loops

解决方案


您可以简单地使用嵌套列表推导并去除最后一个元素:

>>> [e for i in arr0 for e in [i, "XX"]][:-1]
['aa', 'XX', 'bb', 'XX', 'cc', 'XX', 'dd']

您还可以使用.split()/.join()技巧(可能性能较差):

>>> ",XX,".join(arr0).split(",")
['aa', 'XX', 'bb', 'XX', 'cc', 'XX', 'dd']

一种更好的方法是使用itertools.chain

>>> from itertools import chain
>>> list(chain.from_iterable(zip(arr0, ["XX"]*len(arr0))))[:-1]
['aa', 'XX', 'bb', 'XX', 'cc', 'XX', 'dd']

编辑:对于稍后添加到问题的替代情况,可以对输入进行切片并手动将最后一个元素附加到输出:

>>> arr1 = ['aa','bb','cc','dd', 'Note']
>>> [e for i in arr1[:-1] for e in [i, "XX"]][:-1] + [arr1[-1]]
['aa', 'XX', 'bb', 'XX', 'cc', 'XX', 'dd', 'Note']

推荐阅读