python - 如何将列表中的字符串与列表理解结合起来?
问题描述
例如:
s = ["ab", "cd"]
# expected output ac, ad, bc, bd
# This is easy
print([i+j for i in s[0] for j in s[1]])
# ['ac', 'ad', 'bc', 'bd']
但是当列表的长度大于两个时。如何通过列表理解来实现呢?
s = ["ab", "cd", "ef"]
应该给出ace, acf, ade, adf, bce, bcf, bde, bdf
。(如果我们不使用递归,如何使用 for 循环来实现?)
解决方案
您正在寻找的是这些序列的产物。itertools.product
就是这样做的。唯一的复杂性是将序列转换回字符串,您可以使用join()
:
from itertools import product
s = ["ab", "cd", "ef"]
list(map(''.join, product(*s)))
# ['ace', 'acf', 'ade', 'adf', 'bce', 'bcf', 'bde', 'bdf']
如果您愿意,也可以使用列表推导:
[''.join(t) for t in product(*s)]
您当然可以使用简单的递归函数自己完成此操作。这可能看起来像:
s = ["ab", "cd", "ef"]
def product(l):
if len(l) == 0:
yield ''
return
start, *rest = l
for c in start:
for sublist in product(rest):
yield c + sublist
list(product(s))
# ['ace', 'acf', 'ade', 'adf', 'bce', 'bcf', 'bde', 'bdf']
推荐阅读
- intellij-idea - 为 IntelliJ 构建工件键盘快捷键
- django - UnicodeDecodeError:“utf-8”编解码器无法解码位置 0 中的字节 0xdd
- javascript - 从 html5 获取文件大小拖放文件夹
- mysql - 通过传递动态数组从数据库中获取数据
- c# - 在 IIS 上将 WCF 发布为 https 出现错误
- python - 我只能在 pycharm 中使用 selenium,但不能在 gnome-terminal 中使用。它只能在 pycharm 中使用
- google-cloud-dataflow - withHintMatchesManyFiles 真的可以提高TextIO在读取大量文件时的性能吗?
- oracle - 我在 sql oracle 上运行此代码,但出现错误“sql 命令未正确结束”。我的第一个表是 emply,第二个表是部门,
- c - 我们如何通过键盘端口重新启动
- r - 在 R 中按缺失值组转置数据帧