Python在列表中搜索部分匹配项
我在弄清楚解决这个问题的逻辑时遇到了一个问题。我有一个类似以下格式的列表:Python在列表中搜索部分匹配项,python,list,set,match,Python,List,Set,Match,我在弄清楚解决这个问题的逻辑时遇到了一个问题。我有一个类似以下格式的列表: ['blah', 'foo', 'bar', 'jay/day'] 任何没有“/”的名称都是正常名称。任何带有“/”字符的内容都是名称+附加字符串。我要做的是迭代一组元组,并检查元组的第一个元素是否与列表中的任何名称匹配。但是,我也希望名称“jay”与“jay/day”匹配,但我不希望部分匹配(即不希望“ja”与“jay”部分匹配) 基本上,我希望所有名称都完全匹配,而忽略单个条目中“/”后面的任何内容 任何有助于理解
['blah', 'foo', 'bar', 'jay/day']
任何没有“/”的名称都是正常名称。任何带有“/”字符的内容都是名称+附加字符串。我要做的是迭代一组元组,并检查元组的第一个元素是否与列表中的任何名称匹配。但是,我也希望名称“jay”与“jay/day”匹配,但我不希望部分匹配(即不希望“ja”与“jay”部分匹配)
基本上,我希望所有名称都完全匹配,而忽略单个条目中“/”后面的任何内容
任何有助于理解此逻辑的帮助都将不胜感激。为了简单起见,我将创建一个新列表,同时忽略
/
和/
后面的字符,然后进行检查。使用set
查找交点
import re
test_list = ['blah', 'foo', 'bar', 'jay/day']
set(('unknown', 'bar', 'foo', 'jay', 'anonymous', 'ja')).intersection(set([re.sub("/[\w]*","",i) for i in test_list]))
为了简单起见,我将创建一个新列表,同时忽略
/
和/
后面的字符,然后进行检查。使用set
查找交点
import re
test_list = ['blah', 'foo', 'bar', 'jay/day']
set(('unknown', 'bar', 'foo', 'jay', 'anonymous', 'ja')).intersection(set([re.sub("/[\w]*","",i) for i in test_list]))
走传统的环路。这将元组中的名称与lst中的名称匹配:
lst = ['blah', 'foo', 'bar', 'jay/day']
tupl = ('unknown', 'bar', 'foo', 'jay', 'anonymous', 'ja', 'day')
for x in tupl:
for y in lst:
if x == y.split('/')[0]:
print(x, y)
# bar bar
# foo foo
# jay jay/day
走传统的环路。这将元组中的名称与lst中的名称匹配:
lst = ['blah', 'foo', 'bar', 'jay/day']
tupl = ('unknown', 'bar', 'foo', 'jay', 'anonymous', 'ja', 'day')
for x in tupl:
for y in lst:
if x == y.split('/')[0]:
print(x, y)
# bar bar
# foo foo
# jay jay/day
您可以将列表复制到一个新列表中,其中只包含“/”之前的内容,而不是每次循环遍历列表并按“/”进行拆分
input_tuples = [('jay', 'other'), ('blah', 'other stuff')]
list_strings = ['blah', 'foo', 'bar', 'jay/day']
# Using a set as @Patrick Haugh suggested for faster look up
new_strings = {x.split('/')[0] for x in list_strings}
for tup in input_tuples:
if tup[0] in new_strings:
print('found', tup[0])
# outputs found jay, found blah
您可以将列表复制到一个新列表中,其中只包含“/”之前的内容,而不是每次循环遍历列表并按“/”进行拆分
input_tuples = [('jay', 'other'), ('blah', 'other stuff')]
list_strings = ['blah', 'foo', 'bar', 'jay/day']
# Using a set as @Patrick Haugh suggested for faster look up
new_strings = {x.split('/')[0] for x in list_strings}
for tup in input_tuples:
if tup[0] in new_strings:
print('found', tup[0])
# outputs found jay, found blah
使用正则表达式:
import re
l = ['blah', 'foo', 'bar', 'jay/day']
def match(name, l):
for each in l:
if re.match("^{}(\/|$)".format(name), each):
return True # each if you want the string
return False
结果:
match('ja', l) # False
match('jay', l) # True
match('foo', l) # True
使用元组:
tupl = ('unknown', 'bar', 'foo', 'jay', 'anonymous', 'ja')
res = [match(x, l) for x in tupl]
res:
使用正则表达式:
import re
l = ['blah', 'foo', 'bar', 'jay/day']
def match(name, l):
for each in l:
if re.match("^{}(\/|$)".format(name), each):
return True # each if you want the string
return False
结果:
match('ja', l) # False
match('jay', l) # True
match('foo', l) # True
使用元组:
tupl = ('unknown', 'bar', 'foo', 'jay', 'anonymous', 'ja')
res = [match(x, l) for x in tupl]
res:
Show expected value+您尝试了什么Show expected value+您尝试了什么如果'day'在
tupl
中,则该案例将失败。我认为循环是可行的,只是不想在我已经很大的嵌套循环中添加额外的循环。但如果这是唯一可行的办法,我会接受的。Thanks@Endyd谢谢刚刚解决了这个问题。如果“day”在tupl
中,这个例子将失败。我认为循环是一种可行的方法,只是不想在我已经很大的嵌套循环中添加额外的循环。但如果这是唯一可行的办法,我会接受的。Thanks@Endyd谢谢刚刚解决了这个问题。我认为这是正确的方法,但是您可以将新字符串
设置为一个集合而不是一个列表,以便更快地查找。我认为这是正确的方法,但是您可以将新字符串
设置为一个集合而不是一个列表,以便更快地查找。