繁体   English   中英

如何获取列表中字符串的所有相邻组合?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM