[英]How to get all adjacent combinations of a string in a list?
假设你有一个类似的列表:
['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)
Output:
[['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'
现在可以自由地将product(...)
中的三元组放入连接词中,并生成 output:
[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)]
Output:
[['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']]
您需要遍历从第一个元素到最后一个元素的列表。 当您遍历它们时,使用字符串连接 function 连接。
a = ['hi', 'my_name', 'is_max', 'arnold']
b = []
for i in range(len(a)):
for j in range(i+1,len(a)+1):
b.append('_'.join(a[i:j]))
for i in b: print(i)
Output:
hi
hi_my_name
hi_my_name_is_max
hi_my_name_is_max_arnold
my_name
my_name_is_max
my_name_is_max_arnold
is_max
is_max_arnold
arnold
我会做以下事情: -
txt=['hi', 'my_name', 'is_max', 'arnold']
txtg=""
newlist=[]
for i in range(0,len(txt)):
for j in range(i,len(txt)):
if txtg=="":
txtg=txt[j]
else:
txtg=txtg+"_"+txt[j]
newlist.append(txtg)
txtg=""
print(newlist)
Output:
['hi', 'hi_my_name', 'hi_my_name_is_max', 'hi_my_name_is_max_arnold', 'my_name', 'my_name_is_max', 'my_name_is_max_arnold', 'is_max', 'is_max_arnold', 'arnold']
您可以将递归与生成器一起使用:
data = ['hi', 'my_name', 'is_max', 'arnold']
def groups(d, c = []):
if not d:
yield c
else:
if c:
yield from groups(d[1:], c = c[:-1]+[f'{c[-1]}_{d[0]}'])
yield from groups(d[1:], c + [d[0]])
print(list(groups(data)))
Output:
[['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']]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.