检查两个项目是否在列表中但未按设定顺序排列?

时间:2018-04-16 15:38:31

标签: python string list

我有一个清单

listOfStations = ['FSTL40503', 'LHSL40503', 'WEHL40503', 'BKGL40503', 'DDKL40503', 'RNML40503', 'PFLL40503', 'GRYL40503']

我想先检查FSTL40503是否排在首位,然后PFLL40503排在第二位。我现在可以找到两者是否存在,但它不符合我想要的顺序。

toBeChecked=['PFLL40503','FSTL40503']
if all(item in listOfStations for item in toBeChecked):
    print "Both stations found in order, in list"

目前正在打印它不应该做的,因为它不是正确的路线。

我还试图加入列表中的两个条目来制作一个字符串并检查,但我认为我很困惑需要做的事情:

z= ''.join(toBeChecked)
  print z
  for char in z:
    if char not in listOfStations:
      print listOfStations
      continue
    else:
      listOfStations = listOfStations[listOfStations.index(char) + 1:]    
    confirmedTrainList.append(trainList[i])

3 个答案:

答案 0 :(得分:7)

你可以获得一个超过listOfStations的迭代器,它会在搜索时使用列表,所以它永远不会考虑相同的元素两次。

def contains_in_order(container, items):
    it = iter(container)
    return all(item in it for item in items)

should_not_work = ['PFLL40503', 'FSTL40503']
should_work     = ['FSTL40503', 'PFLL40503']

listOfStations = ['FSTL40503', 'LHSL40503', 'WEHL40503', 'BKGL40503', 'DDKL40503', 'RNML40503', 'PFLL40503', 'GRYL40503']

print(contains_in_order(listOfStations, should_not_work))
# False
print(contains_in_order(listOfStations, should_work))
# True

答案 1 :(得分:1)

您可以查看每个电台的索引:

listOfStations = ['FSTL40503', 'LHSL40503', 'WEHL40503', 'BKGL40503', 'DDKL40503', 'RNML40503', 'PFLL40503', 'GRYL40503']
toBeChecked=['PFLL40503','FSTL40503']

def check(to_check, big_list):
    try:
        return big_list.index(to_check[0]) < big_list.index(to_check[1])
    except ValueError:
        return False


check(['PFLL40503','FSTL40503'], listOfStations)
# False
check(['LHSL40503', 'GRYL40503'], listOfStations)
# True

答案 2 :(得分:0)

我发现以下相当优雅:

def in_order_exist(lst, to_find):
    try:
        lst[:lst.index(to_find[1])].index(to_find[0])
        return True
    except:
        return False

print(in_order_exist(listOfStations, toBeChecked))  # True

我们的想法是检查第一个元素是否存在于列表开头和第二个元素定义的子列表中。

我假设:

  • 仅限两个元素(因为OP的标题)
  • 正确排序toBeChecked列表。