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

If statements depending on order of content in a string

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

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

因此,如果 "Long"string 中出现在 "Short" 之前,则执行 x。

或者如果 "Short"string 中出现在 "Long" 之前,则执行 y。

请注意 string 不一定包含 "Long""Short"。它可以只包含其中之一,或者 none.

目前,如果存在 "Long""Short" 之一,我将使用下面的代码执行不同的操作。但如果两者都存在,我想将 length 设置为第一个出现的那个。

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

使用str.index and 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") 

使用string.find获取子字符串的索引。如果不存在,它将 return -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

这是一个通用的解决方案,利用 .find() 将 return 从 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 作为要搜索的子字符串列表。

它 return 是在 s 中找到的第一个 subS,从 sLstNone 如果找到 none .

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']