python - 如何获取列表中字符串的所有相邻组合?
问题描述
假设你有一个类似的列表:
['hi', 'my_name', 'is_max', 'arnold']
您将如何生成与“_”连接的所有相邻组合,即
[['hi_my_name_is_max_arnold'], ['hi', 'my_name_is_max_arnold'], ['hi_my_name_is_max', 'arnold'], ['hi', 'my_name_is_max', 'arnold' ... etc
注意它仅有的任意长度 i 的相邻组合。你不可能有'my_name_hi'
。
谢谢
解决方案
IIUC,使用itertools.product
from itertools import product
l = ['hi', 'my_name', 'is_max', 'arnold']
sep = [("_", ";") for _ in range(len(l)-1)]
t = "{}".join(l)
res = [t.format(*s).split(";") for s in product(*sep)]
print(res)
输出:
[['hi_my_name_is_max_arnold'],
['hi_my_name_is_max', 'arnold'],
['hi_my_name', 'is_max_arnold'],
['hi_my_name', 'is_max', 'arnold'],
['hi', 'my_name_is_max_arnold'],
['hi', 'my_name_is_max', 'arnold'],
['hi', 'my_name', 'is_max_arnold'],
['hi', 'my_name', 'is_max', 'arnold']]
解释:
解决方案基本上是生成一个joiner _
和一个separator ;
。对于单词之间的每个空格,可以放置连接符或分隔符。
话虽如此,所有可能的结果都可以使用 的三倍积来计算("_", ";")
,因为存在三个空格和两个可能的输入:
product(("_", ";"), ("_", ";"), ("_", ";"))
# or equivalent of product(*sep)
这应该产生8个产品:
[('_', '_', '_'),
('_', '_', ';'),
('_', ';', '_'),
('_', ';', ';'),
(';', '_', '_'),
(';', '_', ';'),
(';', ';', '_'),
(';', ';', ';')]
下一个问题是如何将它们放在单词之间。我习惯于str.format
连接这些词:
t = "{}".join(l)
t
# 'hi{}my_name{}is_max{}arnold'
现在可以自由地将三元组 fromproduct(...)
放入连接的单词中并进行输出:
[t.format(*s) for s in product(*sep)]
# Outcome:
['hi_my_name_is_max_arnold',
'hi_my_name_is_max;arnold',
'hi_my_name;is_max_arnold',
'hi_my_name;is_max;arnold',
'hi;my_name_is_max_arnold',
'hi;my_name_is_max;arnold',
'hi;my_name;is_max_arnold',
'hi;my_name;is_max;arnold']
然后使用str.split
,或者在我的情况下,在一行中执行:
[t.format(*s).split(";") for s in product(*sep)]
输出:
[['hi_my_name_is_max_arnold'],
['hi_my_name_is_max', 'arnold'],
['hi_my_name', 'is_max_arnold'],
['hi_my_name', 'is_max', 'arnold'],
['hi', 'my_name_is_max_arnold'],
['hi', 'my_name_is_max', 'arnold'],
['hi', 'my_name', 'is_max_arnold'],
['hi', 'my_name', 'is_max', 'arnold']]
推荐阅读
- sql - 在 case 表达式中调用别名
- php - 带有 JSON 数据的简单 curl 到 PHP 脚本会产生空的 $_POST
- android - 生成位图动画时的存储效率
- xpath - 网页抓取选择器
- c++ - memory_order_seq_cst 栅栏什么时候有用?
- docker - 即使登录 docker 并成功,也无法将图像推送到 ECR
- angular - 当我将订阅数据用于component.html Angular 6/8时,为什么我会得到一组未定义的对象?
- angular - 在 IIS 服务器上托管时的位置策略
- c - 为什么 C 中的绝对值函数不接受 const 输入?
- loops - SQL - 查找具有特定项目组合的订单(来自另一个表)