在 python 列表中向后或向前循环以查找匹配项
Posted
技术标签:
【中文标题】在 python 列表中向后或向前循环以查找匹配项【英文标题】:looping backward or forward in python list to find a match 【发布时间】:2019-07-18 12:55:29 【问题描述】:我有一个 python 列表,我将在其中搜索并找到一个术语。一旦我找到它,我需要在列表中后退并使用=
找到第一个匹配项,然后继续使用;
找到第一个匹配项。
我尝试使用 while 循环,但它不起作用。
extract = [1,2,"3=","fd","dfdf","keyword","ssd","sdsd",";","dds"]
indices = [i for i,s in enumerate(extract) if 'keyword' in s]
for ind in indices:
ind_while_for = ind
ind_while_back = ind
if ('=' in extract[ind]) & (';' in extract[ind]):
print(extract[ind])
if (';' in extract[ind]) & ('=' not in extract[ind]):
while '=' in extract[ind_while_back-1]:
ind_while_back -= 1
print(' '.join(extract[ind_while_back:ind]))
需要结果:3= fd dfdf keyword ssd sdsd ;
【问题讨论】:
你肯定混淆了&
和and
。你需要后者。
请注意,您不能迭代列表中的整数元素。你的 if 参数应该是: if '=' in str(extract[ind]) and ';'在 str(extract[ind]):
当您可以简单地跟踪 =
的最后一次出现时,为什么要“向后循环”?找到关键字后,您可以继续操作,直到点击 ;
,您将获得输出所需结果所需的所有信息。
如果extract = ["=keyword;"]
,我们应该打印它吗?
如果extract = ['=', 'keyword', ';', '=', 'keyword', 'a;' ]
,我们应该打印两个?
【参考方案1】:
查找关键字的位置:
kw = extract.index("keyword")
在关键字位置之前的原始列表的子列表中找到包含"="
的最大索引的元素:
eq = max(i for i,w in enumerate(extract[:kw])
if isinstance(w,str) and "=" in w)
在从前一个元素到末尾的子列表中查找包含";"
的索引最小的元素:
semi = min(i for i,w in enumerate(extract[eq:], eq)
if isinstance(w,str) and ';' in w)
提取两个极端之间的子列表:
extract[eq:semi+1]
#['3=', 'fd', 'dfdf', 'keyword', 'ssd', 'sdsd', ';']
【讨论】:
kw = extract.index("keyword")
关键字可能没有完全匹配...可能是搜索可以是key
或eywo
等
你一定提到你会接受近似匹配。
请注意,这在长列表上效率很低。示例一不是问题,但如果实际数据集长度为 1000 多个项目,它肯定会是一个问题......
@brunodesthuilliers 不是非常低效的,因为它只需要遍历列表两次。但有点低效,是的。【参考方案2】:
你可以使用:
l = [1, 2, "3=", "fd", "dfdf", "keyword", "ssd", "sdsd", ";", "dds"]
s = "keyword"
def take(last, iterable):
l = []
for x in iterable:
l.append(x)
if last in x:
break
return l
# get all elements on the right of s
right = take(';', l[l.index(s) + 1:])
# get all elements on the left of s using a reversed sublist
left = take('=', l[l.index(s)::-1])
# reverse the left list back and join it to the right list
subl = left[::-1] + right
print(subl)
['3=', 'fd', 'dfdf', 'keyword', 'ssd', 'sdsd', ';']
【讨论】:
如何获取包含=
和;
的列表??像这样['3=', 'fd', 'dfdf', 'keyword', 'ssd', 'sdsd', ';']
而不是['fd', 'dfdf', 'keyword', 'ssd', 'sdsd']
@qwww 比你需要实现自己的takewhile()
函数。查看我编辑的解决方案。【参考方案3】:
试试下面的功能:
extract = ['1','2','3=','fd','dfdf','keyword','ssd','sdsd',';','dds']
def get_output_list(extract, key):
equals_indices = [i for i,j in enumerate(extract) if '=' in j]
semicolon_indices = [i for i,j in enumerate(extract) if ';' in j]
if key not in extract or len(equals_indices) == 0 or len(semicolon_indices) == 0:
return 'no match found1'
keyword_index = extract.index(key)
if any([keyword_index<i for i in semicolon_indices]) and any([keyword_index>i for i in equals_indices]) :
required_equal_index = keyword_index - equals_indices[0]
required_semicolon_index = semicolon_indices[0] - keyword_index
for i in equals_indices:
if (i < keyword_index) and required_equal_index > i:
required_equal_index = i
for i in semicolon_indices:
if (i > keyword_index) and (required_semicolon_index < i) :
required_semicolon_index = i
return extract[required_equal_index:required_semicolon_index+1]
else :
return 'no match found'
【讨论】:
以上是关于在 python 列表中向后或向前循环以查找匹配项的主要内容,如果未能解决你的问题,请参考以下文章