首页 > 解决方案 > 如何获取列表中字符串的所有相邻组合?

问题描述

假设你有一个类似的列表:

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

谢谢

标签: pythonpython-3.xlistcombinationspermutation

解决方案


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

推荐阅读