If 语句取决于字符串中内容的顺序



我想根据字符串中内容的顺序创建不同的if语句。

string = "ABC Long Short DEF"
string = "XYZ Short Long ZYX"

因此,如果"Long"先于"Short" string做x。

或者,如果"Short"先于"Long" string做y。

请注意,string不一定必须同时包含 "Long""Short" 。它可以只包含其中之一,也可以不包含。

目前,如果有"Long""Short"之一,我使用以下代码执行不同的事情。但是,如果两者都存在,我想length设置为首先出现的那个。

if "Long" in string:
    length = "Long"
if "Short" in string:
    length = "Short"

使用 string.find 来获取子字符串的索引。如果不存在,它将返回 -1。

def long_or_short(s):
    sh = s.find("Short")
    ln = s.find("Long")
    if 0 <= sh < ln or ln < 0 <= sh:
        return "Short"
    elif 0 <= ln:
        return "Long"
    else:
        return None

使用 str.index 和 EAFP

try:
    if string.index("Long") < string.index("Short"):
        length = "Long"
    else:
        length = "Short"
except ValueError:
    if "Long" in string:
        length = "Long"
    elif "Short" in string:
        length = "Short"
    else:
        print ("Long and Short not in string") 

这是一个通用解决方案,利用.find()将返回从n子字符串列表中匹配的第一个子字符串,而不是简单地n=2'Long''Short',此解决方案可以扩展到任意数量的可能子字符串

双线通用解决方案

# assuming string variable to search is named 'string'
l = filter(lambda x: x[0] > 0, [[string.find(s),s] for s in ["Long","Short"]])
subString = min(l, key=lambda x: x[0])[1] if l else None

更多信息功能

s作为要搜索的字符串,sLst作为要搜索的子字符串的列表。

它返回在 s 中找到的第一个subS,如果找不到sLstNone

def getFirst(s, sLst):
    search = [[s.find(subS),subS] for subS in sLst] # list of [first_occurence, substring]
    search = filter(lambda x: x[0] > 0, search) # filter out searches that returned -1
    if search:
        minSearch = min(search, key=lambda x: x[0]) # find first occurrence
        return minSearch[1] # get subStr
    else:
       return None  # if none found, returns none

searchList = ['Long','Short']
strTests = [
            "ABC Long Short DEF",
            "XYZ Short Long ZYX",
            "XYZ Short lbah ZYX",
            "XYZ blal  Long ZYX",
            "I am a random String",
            "I am a really Long string with no Short Parts"
            ]
# test against test cases for ["Long","Short"]
results = [getFirst(string, searchList) for string in strTests]
print results
['Long', 'Short', 'Short', 'Long', None, 'Long']
# test against test cases for more generic case
searchList = ['Long', 'Short', 'really']
results = [getFirst(string, searchList) for string in strTests]
print results
['Long', 'Short', 'Short', 'Long', None, 'really']

最新更新