我想根据字符串中内容的顺序创建不同的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
,如果找不到sLst
或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']