Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在列表中搜索部分匹配项_Python_List_Set_Match - Fatal编程技术网

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谢谢刚刚解决了这个问题。我认为这是正确的方法,但是您可以将
新字符串
设置为一个集合而不是一个列表,以便更快地查找。我认为这是正确的方法,但是您可以将
新字符串
设置为一个集合而不是一个列表,以便更快地查找。