在每个其他元素列表理解之后在 Python 列表中插入元素

Insert element in Python list after every other element list comprehension

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

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

在外部理解中,我试图 return 它作为一个字符串列表。我正在尝试使用 isinstance 来检查元素是否是列表(最后一项是字符串),如果不是 return 则只是字符串。

编辑

非常感谢您的回复。我应该包括我确实遇到的这种替代情况,我不希望在末尾的 'Note' 元素之后插入元素,在这种情况下我无法执行切片。负索引有可能吗?

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

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

您可以简单地使用嵌套列表理解并删除最后一个元素:

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

只是为了好玩,如果您想要列表理解本身中的所有逻辑,可以考虑另一种选择:

from itertools import zip_longest

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

padded_list = [
    value
    for item in zip_longest(initial_list, ["XX"] * (len(initial_list) - 1))
    for value in item
    if value
]

print(padded_list)

输出:

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