J'ai une liste

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

Je veux vérifier que FSTL40503 vient en premier, puis PFLL40503 vient en deuxième. Je peux actuellement trouver si les deux existent, mais cela ne respecte pas l'ordre de ce que je veux.

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

Cela imprime actuellement ce qu'il ne devrait pas faire car ce n'est pas la bonne route.

J'ai également essayé de joindre les deux entrées de la liste pour créer une chaîne et vérifier, mais je pense que je suis confus sur ce qui doit être fait:

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
Gray Ridley 16 avril 2018 à 18:38

3 réponses

Meilleure réponse

Vous pouvez obtenir un itérateur sur listOfStations qui consommera la liste lors de sa recherche, donc il ne considérera jamais le même élément deux fois.

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
7
Patrick Haugh 16 avril 2018 à 15:56

Je trouve les éléments suivants assez élégants:

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

L'idée est de vérifier si le premier élément existe dans la sous-liste définie par le début de la liste et le deuxième élément.


Je suppose:

  • deux éléments seulement (en raison du titre de l'OP)
  • ordre correct de la liste toBeChecked.
0
Ev. Kounis 16 avril 2018 à 15:48

Vous pouvez vérifier l'index de chaque station:

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
1
Thierry Lathuille 16 avril 2018 à 15:46