Я пытаюсь создать функцию для смешивания двух списков в python, или я скорее скажу, что элемент list2 в list1. Необходимо, чтобы в списке вывода, не более чем два элемента рядом два друг с другом, имеют то же значениеСмешать два списка python
Например:
list1 = [1,1,1,1,1]
list2 = [2,2,2,2,2]
output = [1,1,2,1,2,2,1,2,1,2]
Неправильный выход Пример:
# There are more than two '1' standing next two each other
output = [1,1,1,2,2,1,2,1,2,2]
Вот мой раствор:
def guyGenerator(toughGuy,softGuy):
i = 0
while len(softGuy) > 0:
temp = softGuy[:1]
while i < len(toughGuy) - 1:
if toughGuy[i] == toughGuy[i + 1] == 2:
toughGuy.insert(random.randint(i, i + 1), temp[0])
i = i + 1
softGuy = softGuy[1:]
return toughGuy
Вопрос заключается в получении выходных данных более чем с двумя одинаковыми элементами Энты стоя двух следующих друг с другом или длину списка вывода больше, чем совмещать длину двух списков
Например, один мой выход
[2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 2]
Что я здесь делаю неправильно?
Edit 1
Clodion спросил меня, так что я положил это здесь
Результаты могут быть случайными, если они удовлетворяют требованиям в этом вопросе. Порядок элементов не имеет значения, пока не более двух элементов, стоящих рядом друг с другом не имеют одинаковое значение
Edit 2
Я пытаюсь бездельничать по созданию Iterable класса, используя Clodion. Вот новый код:
import random
class GuyGenerator:
def __init__(self,toughGuyList,softGuyList):
self.toughGuyList = toughGuyList
self.softGuyList = softGuyList
def __iter__(self):
return self
def __next__(self):
listSum = self.toughGuyList + self.softGuyList
while True:
res = random.sample(listSum,len(listSum))
if not any([res[i-2]==res[i-1]==res[i] for i in range(len(listSum))]):
break
return res
toughGuy = ['tough','tough','tough','tough','tough','tough','tough','tough']
softGuy = ['soft','soft','soft','soft','soft','soft','soft','soft']
for guy in GuyGenerator(toughGuy,softGuy):
print(guy)
В результате получилось довольно хорошо, для кода, выполняющегося неограничен, за исключением, и я должен использовать KeyboardInterrupt, чтобы остановить код. Что я делаю неправильно в этом случае? Буду признателен с тщательным объяснением, так как я новичок в Python и итераторе
Редактировать 3
решена проблема итератора, проще, чем я думаю. Оказалось, что вернулся в ITER является то, что класс возврата при вызове в для цикла
Решение:
def __iter__(self):
listSum = self.listRandom1 + self.listRandom2
while True:
self.res = random.sample(listSum,len(listSum))
if not any([self.res[i-2]==self.res[i-1]==self.res[i] for i in range(len(listSum))]):
break
return iter(self.res)
Что произойдет, если 'list's таковы, что нет никакого способа, чтобы расположить их так (например,' песни1 = [1,1,1]; песни2 = [1,1,1] ')? Каждый «список» всегда содержит один номер? – TigerhawkT3
@Tuan Dinh: Можете ли вы сказать, хотите ли вы случайный результат или нет, пожалуйста? Заранее спасибо. И отредактируйте свой вопрос, чтобы написать его? – Clodion
@Clodion: да, результат может быть случайным, если они удовлетворяют требованию –