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