Проверить неопределенное количество элементов
Начинаю изучать питон
Есть функция
def stop_came(self):
win_combi = self.win_combinations()
for each in win_combi:
if self.strs[each[0]] == self.strs[each[1]] == self.strs[each[2]] == self.strs[each[3]]:
return self.strs[each[0]]
return False
Вопрос заключается в том, что элементов self.strs[each[0]] может быть и 5, и 6 и т.д.
Как в этой строке
if self.strs[each[0]] == self.strs[each[1]] == self.strs[each[2]] == self.strs[each[3]]
сделать проверку всех элементов?
Ответы (2 шт):
Автор решения: Namerek
→ Ссылка
def stop_came(it):
if not it:
# Возвращаем значение если условный список пуст
return False
first, *others = it
if not others:
# Возвращаем значение если условный список имеет один элемент
return True
return all([item == first for item in others])
list_a = [2, 2, 2, 2]
list_b = [11, 11, 11, 12, 14]
list_c = [6, 6]
print(stop_came(list_a))
# True
print(stop_came(list_b))
# False
print(stop_came(list_c))
# True
Автор решения: Stanislav Volodarskiy
→ Ссылка
Перепишем stop_came с использованием функции unambiguous:
def stop_came(self):
win_combi = self.win_combinations()
for each in win_combi:
if unambiguous(self.strs[i] for i in each):
return self.strs[each[0]]
return False
Если self.strs[i] хешируются (строки, числа, кортежи), unambiguous может быть такой:
def unambiguous(seq):
return len(set(seq)) <= 1
Если хешировать нельзя, код будет сложнее:
def unambiguous(seq):
it = iter(seq)
first = next(it, None)
return all(v == first for v in it)
P.S. Оба варианта возвращают истину если в последовательности все значения равны или последовательность пуста.