gpt4 book ai didi

python - 连接字符串列表中的选定字符串

转载 作者:太空狗 更新时间:2023-10-30 00:13:07 25 4
gpt4 key购买 nike

问题如下。我有一个字符串列表

lst1=['puffing','his','first','cigarette','in', 'weeks', 'in', 'weeks']

我想获取字符串

lst2=['puffing','his','first','cigarette','in weeks', 'in weeks']

这是为了连接子列表 ['in', 'weeks'] 的任何出现,此处不相关,其中 find_sub_list1 取自 here (并包含在下面的代码中):

npis = [['in', 'weeks'], ['in', 'ages']]

# given a list a candidate sublist, return the index of the first and last
# element of the sublist within the list
def find_sub_list1(sl,l):
results=[]
sll=len(sl)
for ind in (i for i,e in enumerate(l) if e==sl[0]):
if l[ind:ind+sll]==sl:
results.append((ind,ind+sll-1))

return results

def concatenator(sent, npis):
indices = []
for npi in npis:
indices_temp = find_sub_list1(npi, sent)
if indices_temp != []:
indices.extend(indices_temp)
sorted(indices, key=lambda x: x[0])

for (a,b) in indices:
diff = b - a
sent[a:b+1] = [" ".join(sent[a:b+1])]
del indices[0]
indices = [(a - diff, b - diff) for (a,b) in indices]

return sent

此编码器返回的不是所需的 lst2:

concatenator(lst1,['in', 'weeks'])
>>['puffing','his','first','cigarette','in weeks', 'in', 'weeks']

所以它只连接第一次出现的地方。关于代码在哪里失败的任何想法?

最佳答案

因为所需的子序列是 'in' 'weeks' 可能还有'in''ages'

一个可能的解决方案是(虽然循环不是很优雅):

  1. 首先找到'in'所在的所有位置发生。

  2. 然后遍历源列表,将元素附加到目标列表,并处理 'in' 的位置特别地,即如果后面的单词在一个特殊的集合中,则将这两个单词连接起来并追加到目标,将迭代器额外推进一次。

  3. 一旦源列表耗尽,将抛出 IndexError,指示我们应该打破循环。

代码:

index_in = [i for i, _ in enumerate(lst1) if _ == 'in']

lst2 = []; n = 0

while True:
try:
if n in index_in and lst1[n+1] in ['weeks', 'ages']:
lst2.append(lst1[n] + lst1[n+1])
n += 1
else:
lst2.append(lst1[n])
n += 1
except IndexError:
break

更好的方法是通过正则表达式。

  1. 将列表加入一个以空格作为分隔符的字符串

  2. 在空格上拆分列表,除了那些被 in<space>weeks 包围的空格.这里,我们可以使用negative lookahead & lookbehind

代码:

import re

c = re.compile(r'(?<!in) (?!weeks)')

lst2 = c.split(' '.join(lst1))

关于python - 连接字符串列表中的选定字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43729403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com