为了账号安全,请及时绑定邮箱和手机立即绑定

Python 在列表中搜索部分匹配项

Python 在列表中搜索部分匹配项

繁花不似锦 2021-11-09 20:14:38
我在弄清楚解决这个问题的逻辑时遇到了问题。我有一个看起来像这种格式的列表:['blah', 'foo', 'bar', 'jay/day']没有“/”的任何东西都是正常名称。任何带有 '/' 字符的东西都是一个名字 + 一个额外的字符串。我想要做的是遍历一组元组并检查元组的第一个元素是否与列表中的任何名称匹配。但是,我也希望名称“jay”与“jay/day”匹配,但我不希望部分匹配(即不希望“ja”部分匹配到“jay”)。基本上我想要一个完全匹配的任何名称,同时忽略单个条目中“/”之后的任何内容。任何帮助弄清楚这个逻辑的帮助将不胜感激。
查看完整描述

3 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

您可以将列表复制到一个新列表,而不是每次都遍历列表并用“/”分割


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


查看完整回答
反对 回复 2021-11-09
?
暮色呼如

TA贡献1853条经验 获得超9个赞

选择传统的循环方式。这将元组中的名称与 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


查看完整回答
反对 回复 2021-11-09
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

使用正则表达式:


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]

资源:


[False, True, True, True, False, False]


查看完整回答
反对 回复 2021-11-09
  • 3 回答
  • 0 关注
  • 332 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信