Exp*_*ate 2 python for-loop nested list-comprehension nested-loops
目标是在列表中除最后一个元素之外的每个其他元素之后插入一个字符串:
arr0 = ['aa','bb','cc','dd']
Run Code Online (Sandbox Code Playgroud)
目标
['aa','XX','bb', 'XX','cc','XX','dd']
Run Code Online (Sandbox Code Playgroud)
这一主题已在类似这样的帖子中得到解决,但所使用的字符串列表的长度只有一个字符,这会影响列表的理解。我没有足够的声誉点来发表评论并要求澄清。
我已经用 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']
Run Code Online (Sandbox Code Playgroud)
[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]
Run Code Online (Sandbox Code Playgroud)
分解
[[el, 'XX'] if idx != len(arr0)-1 else el for idx, el in enumerate(arr0)]
# Returns
# [['aa', 'XX'], ['bb', 'XX'], ['cc', 'XX'], 'dd']
Run Code Online (Sandbox Code Playgroud)
在外部理解中,我试图将其作为单个字符串列表返回。我试图用来isinstance检查元素是否是列表(最后一项是字符串),如果不是,则仅返回字符串。
我真的很感谢大家的回复。我应该包含这种替代情况,我确实遇到了这种情况,即我不希望在末尾的“Note”元素之后插入元素,在这种情况下我无法执行切片。是否可以使用步骤进行负索引?
# Alternative scenario
arr1 = ['aa','bb','cc','dd', 'Note']
# ['aa','XX,'bb','XX,'cc','XX,'dd','Note']
Run Code Online (Sandbox Code Playgroud)
您可以简单地使用嵌套列表理解并删除最后一个元素:
>>> [e for i in arr0 for e in [i, "XX"]][:-1]
['aa', 'XX', 'bb', 'XX', 'cc', 'XX', 'dd']
Run Code Online (Sandbox Code Playgroud)
您还可以使用.split()/.join()技巧(这可能性能较差):
>>> ",XX,".join(arr0).split(",")
['aa', 'XX', 'bb', 'XX', 'cc', 'XX', 'dd']
Run Code Online (Sandbox Code Playgroud)
一种更奇特的方法是使用itertools.chain:
>>> from itertools import chain
>>> list(chain.from_iterable(zip(arr0, ["XX"]*len(arr0))))[:-1]
['aa', 'XX', 'bb', 'XX', 'cc', 'XX', 'dd']
Run Code Online (Sandbox Code Playgroud)
编辑:对于稍后添加到问题中的替代情况,可以对输入进行切片并手动将最后一个元素附加到输出中:
>>> 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']
Run Code Online (Sandbox Code Playgroud)