python - 在每个其他元素列表理解之后在 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']
解决方案
您可以简单地使用嵌套列表推导并去除最后一个元素:
>>> [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']
推荐阅读
- python-2.x - 需要程序重复而不是结束
- angular - 为什么 RxJs 在链式 http 调用完成之前完成执行?
- javascript - 时间选择器在移动设备上显示 12 小时格式
- string - 如何在生成的连接字符串中包含空格('')?
- json - 在 Go 中键入断言接口以映射的更好方法
- javascript - 弹性搜索;使用弹性构建器基于嵌套属性排除文档
- android - 在 Expo/React Native 中包含 Android 权限
- python - 重新运行一个海龟程序
- java - 使用 Lucene 的正则表达式反向搜索
- python - 有没有一种有效的方法可以在 numpy 数组中创建 N 次伯努利试验的二项式实验?