Как проверить, находятся ли элементы кортежа A в другом кортеже B и элементы находятся в той же последовательности в начале tuple_B?

#python

#python

Вопрос:

 tuple_A = (1,2,3,4)
tuple_B = (1,2,3,4,5,6)
 

этот случай будет истинным, поскольку элементы tuple_A находятся в tuple_B и в том же порядке

 tuple_A = (1,2,3,4)
tuple_B = (1,3,5,4,2,6)
 

но этот случай должен быть ложным, как будто tuple_A является подмножеством tuple_B, но элементы tuple_A не находятся в том же порядке в начале последовательности tuple_B, так что это неправильно

мой код:

 if set(tuple_A).issubset(tuple_B):
   return True
else:
   return False
    
 

Пожалуйста, предложите короткое решение!

Комментарии:

1. Следует 1,2,3 ли считать подмножеством 1,5,2,6,3,7 ?

2. Вам нужна подпоследовательность, а не подмножество.

3. Но последовательность также может происходить в любом порядке. tuple_A(1,2,3) должен иметь тот же индекс в tuple_B по индексу: [0,1,2] .

4. если tuple_A = (1,2,3,4) и tuple_B = (5,6,1,2,3,4) , то tuple_A является подмножеством tuple_B . Вы согласны с этим? Также что, если значения tuple_A случайным образом распределены внутри tuple_B . Вы все еще будете рассматривать tuple_A подмножество tuple_B ? Можете ли вы уточнить все это в своем вопросе, пожалуйста

5. Пожалуйста, уточните свой вопрос! Будьте более точны в своем определении «подмножества», добавление дополнительных примеров определенно поможет.

Ответ №1:

Это короткое, но не самое эффективное:

 def tupleMatch(A,B): return A == tuple(b for b in B if b in A)

print(tupleMatch((1,2,3,4),(1,2,3,4,5,6))) # True
print(tupleMatch((1,2,3,4),(1,3,5,4,2,6))) # False
 

Ответ №2:

 def check(tuple_A,tuple_B):
    for a,b in zip(tuple_A,tuple_B):
        if a!=b: 
            return False
    return True
 

Комментарии:

1. В вопросе неясно, должно ли совпадение быть в начале кортежей.

2. Совпадение должно быть в начале кортежа

3. Подмножество может находиться в позиции 0 в tuple_B или позже. Как вы с этим справляетесь?

4. Действительно, OP, похоже, запутался в реальных потребностях.

Ответ №3:

Я изменяю свое решение на основе комментария @Mark Ransom — Спасибо @Mark Ransom

Попробуйте

  if (', '   str(A)[1:-1]   ', ') in (', ' str(B)[1:-1] ', '):
   return True
else:
   return False
 

Проверка

Проверка 1:

 A=(1,2,3)
B=(1,2,3,4)
if (', '   str(A)[1:-1]   ', ') in (', ' str(B)[1:-1] ', '):
    print('yes')
else:
    print('No')
# results is 'yes'
 

Проверка 2:

 A=(1,2,3)
B=(101,2,3,4)
if (', '   str(A)[1:-1]   ', ') in (', ' str(B)[1:-1] ', '):
    print('yes')
else:
    print('No')
# results is 'No'
 

Старое caceled решение:

 if str(A)[1:-1] in str(B)[1:-1]:
   return True
else:
   return False
 

Комментарии:

1. Умный, но дает неправильный ответ, если A=(1,2,3) и B=(101,2,3) .

2. Я изменяю свое решение на основе комментария @Mark Ransom

Ответ №4:

Другим альтернативным методом является;

 tuple_A = (1,2,3,4)
tuple_B = (1,2,3,4,5,6)
A_str_rep = ''.join(str(digit) for digit in tuple_A)
B_str_rep = ''.join(str(digit) for digit in tuple_B)
print(B_str_rep.startswith(A_str_rep))
 

Но это не будет идеальным методом для кортежей, содержащих большое количество данных. В соответствии с вашим требованием, поскольку кортеж B должен начинаться с кортежа A, этот метод работает.

Ответ №5:

Я думаю, что алгоритм python умнее этого. Я попробовал ваш код, и он дает мне запрошенный ответ.

Синтаксис кода

 print(set(tuple_A).issubset(tuple_B))
 

Вывод

 True

[Program finished]
 

Я предполагаю, что это дает вам False , я буду рекомендовать вам использовать sorted() . В случае, если этот кортеж является неизменяемым объектом. Мы собираемся воспроизвести кортеж в виде списка, а затем преобразовать его одновременно, не воспроизводя его адрес в памяти.

Синтаксис кода

 tuple_A = (1,2,3,4)
tuple_B = (1,3,5,4,2,6)

print(set(tuple_A).issubset(tuple(sorted(tuple_B))))

# Check why the above print gives `True`
print("*"*40)

print(f"Tuple B before sorting: {tuple_B}nTuple B after sorting: {tuple(sorted(tuple_B))}")
 

Вывод

 True
****************************************
Tuple B before sorting: (1, 3, 5, 4, 2, 6)
Tuple B after sorting: (1, 2, 3, 4, 5, 6)

[Program finished]