Следуя логике вашего примера, это было наиболее целесообразным способом найти «первую» подходящую стрелку и распечатать ее местоположение. Однако порядок наборов не FIFO, поэтому, если вы хотите сохранить порядок, я бы предложил заменить список вместо набора для arrowlist, чтобы сохранить порядок.
arrowlist = {"->x","->", "->>", "-\\", "\\-","//--","->o","o\\--","<->","<->o"}
def cxn(line, arrowlist):
try:
result = tuple((x, line.find(x)) for x in arrowlist if x in line)[0]
print("found an arrow {} at position {} with length {}".format(result[0], result[1], len(result[0])))
# Remember in general it's not a great idea to use an exception as
# broad as Exception, this is just for example purposes.
except Exception:
return 0
Если вы ищете первое совпадение в предоставленной строке (строке), вы можете сделать это следующим образом:
arrowlist = {"->x","->", "->>", "-\\", "\\-","//--","->o","o\\--","<->","<->o"}
def cxn(line, arrowlist):
try:
# key first sorts on the position in string then shortest length
# to account for multiple arrow matches (i.e. -> and ->x)
result = sorted([(x, line.find(x)) for x in arrowlist if x in line], key=lambda r: (r[1],len(r[0])))[0]
# if you would like to match the "most complete" (i.e. longest-length) word first use:
# result = sorted([(x, line.find(x)) for x in arrowlist if x in line], key=lambda r: (r[1], -len(r[0])))[0]
print("found an arrow {} at position {} with length {}".format(result[0], result[1], len(result[0])))
except Exception:
return 0
Или, если у вас есть доступ к стандартной библиотеке, вы можете использовать operator.itemgetter для почти того же эффекта и получить эффективность от меньшего количества вызовов функций:
from operator import itemgetter
arrowlist = {"->x","->", "->>", "-\\", "\\-","//--","->o","o\\--","<->","<->o"}
def cxn(line, arrowlist):
try:
# key first sorts on the position in string then alphanumerically
# on the arrow match (i.e. -> and ->x matched in same position
# will return -> because when sorted alphanumerically it is first)
result = sorted([(x, line.find(x)) for x in arrowlist if x in line], key=(itemgetter(1,0)))[0]
print("found an arrow {} at position {} with length {}".format(result[0], result[1], len(result[0])))
except Exception:
return 0
*** ПРИМЕЧАНИЕ. Я использую несколько иной список стрелок, чем в вашем примере, только потому, что приведенный вами, похоже, не соответствует форматированию кода по умолчанию (вероятно, из-за проблем с закрытием цитаты). Помните, что вы можете добавить строку с 'r' следующим образом: r"Text that can use special symbols like the escape \and\ be read in as a 'raw' string literal\"
. См. Этот вопрос для получения дополнительной информации о необработанных строковых литералах.