#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]