Есть ли эффективный способ поиска списка с другим списком, поддерживающим порядок списка? - PullRequest
3 голосов
/ 03 апреля 2019

Я только начинаю изучать питон.Мне нужно искать один список с другим, но я должен поддерживать порядок списка, с которым я ищу.Пример:

MylistA = [A, B, G, S, X]

MylistB = [A, G, B]

Я хочу, чтобы это возвращало false, поскольку ListB не в том же порядке, что и ListA.Однако, если бы это было:

ListA =[A, B, G, S, X]
ListB =[A, B, G]

Я бы хотел, чтобы это вернуло True.

Вот что я пробовал, однако это занимает много строк и неэффективно.

MylistA = [A, Q, V, B, G, D, F, R, T, B, G, S, Q]
MylistB = [B, G, D, F, R, T]

ListFound = 0
Pos1 = 0
Pos2 = 1
Pos3 = 2
Pos4 = 3
Pos5 = 4
Pos6 = 5

Pos1A = 0
Pos2A = 1
Pos3A = 2
Pos4A = 3
Pos5A = 4
Pos6A = 5

while Pos6 <= len(MylistA):
    if MylistA[pos1] == MylistB[Pos1A] and \
            MylistA[pos2] == MylistB[Pos2A] and \
            MylistA[pos3] == MylistB[Pos3A] and \
            MylistA[pos4] == MylistB[Pos4A] and \
            MylistA[pos5] == MylistB[Pos5A] and \
            MylistA[pos6] == MylistB[Pos6A]:
        print("MylistB found within MylistA at positions", Pos1, Pos2, Pos3, Pos4,     
               Pos5, Pos6)
        MylistFound += 1
    elif Pos6 >= len(ListA):
        print("MylistB was found", ListFound, "times within MylistA") 
    Pos1 += 1
    Pos2 += 1
    Pos3 += 1
    Pos4 += 1
    Pos5 += 1
    Pos6 += 1

Это работает, как и ожидалось, но занимает много строк, и я ищу эффективный метод для достижения тех же результатов.Спасибо за помощь.

Ответы [ 5 ]

3 голосов
/ 03 апреля 2019

Вы можете создать что-то вроде:

ListA = ["A", "Q", "V", "B", "G", "D", "F", "R", "T", "B", "G", "S", "Q"]
ListB = ["B", "G", "D", "F", "R", "T"]

for x in range(0, len(ListA)):
    if ListA[x:len(ListB)+x] == ListB:
        print("Full Match", ListA[x:len(ListB)+x])
        print("Positions", "{}:{}".format(x, len(ListB)+x))
        break

# Full Match ['B', 'G', 'D', 'F', 'R', 'T']
# Positions 3:9 # last value (9) is exclusive

Демо

0 голосов
/ 03 апреля 2019

Вы можете попробовать проверить индекс каждого элемента ListB в ListA и после этого проверить, находятся ли они в правильном порядке:

ListA = ["A","Q","V","B","G","D","F","R","T","B","G","S","Q"]
ListB = ["B","G","D","F","R","T"]

indices=[]
for k in ListB:
  indices.append(ListA.index(k))

if sorted(indices) == indices:
   print "ListB is in ListA in the correct order"
else:
   print "ListB is not in ListA in the correct order"
0 голосов
/ 03 апреля 2019
import collections 

inputList1 = [1, 2, 4, 3, 5] 
inputList2 = [1, 2, 4, 3, 5] 
print ("The first list is : " + str(inputList1)) 
print ("The second list is : " + str(inputList2)) 

# Using Sorting
inputList1.sort() 
inputList2.sort() 
if inputList1 == inputList2: 
    print ("The lists are identical") 
else : 
    print ("The lists are not identical")

# using Collection Counter  
if collections.Counter(inputList1) == collections.Counter(inputList2): 
    print ("The lists are identical") 
else : 
    print ("The lists are not identical")
0 голосов
/ 03 апреля 2019

Преобразование списка в строку перед сравнением позволит вам сделать это в 3 строки: .

Код

   ListA = [10,2,3,4,5,6,7]
   ListB = [10,2]

   str1 = ' '.join(str(e) for e in ListA)
   str2 = ' '.join(str(e) for e in ListB)

   print(str2 in str1)

вывод

>>>true
0 голосов
/ 03 апреля 2019

Вот как я бы это сделал:

def compare(lst_a, lst_b):
    try:
        temp = [lst_a.index(x) for x in lst_b]
    except ValueError:
        res = False
    else:
        res = temp == sorted(temp)
    return res

Некоторые тестовые прогоны:

ListA = ['A', 'B', 'G', 'S', 'X'] 
ListB = ['A', 'G', 'B']
ListC = ['A', 'B', 'G']
ListD = ['A', 'B', 'FOO']

print(compare(ListA, ListB))  #-> False
print(compare(ListA, ListC))  #-> True
print(compare(ListA, ListD))  #-> False ('FOO' does not exist at all in ListA)

Это работает, получая индекс всех записей в ListB изListA и сохранение их в новом списке temp.Если temp отсортировано (temp == sorted(temp)), то ваше правило соблюдено, в противном случае - нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...