#python #merge
Вопрос:
Мне нужно объединить списки (сделать их исключительными друг от друга), отслеживать перекрытие и равномерно распределять перекрытия с несколькими списками. Когда я хочу сделать это с двумя списками, я использую приведенный ниже процесс, и он отлично работает.
Alpha = ['1', '2', '3', '4', '6', '8']
Bravo = ['1', '2', '3', '5', '7', '9']
Overlap = set(Alpha).intersection(Bravo) # ['1','2','3']
AlphaFinal = [record for record in Alpha if record not in Overlap] # ['4','6','8']
BravoFinal = [record for record in Bravo if record not in Overlap] # ['5', '7', '9']
for Index, Value in enumerate(Overlap):
if int(Index) % 2 == 0:
AlphaFinal.append(Value) # ['2']
BravoSkips.append(Value) # ['2']
else:
BravoFinal.append(Value) # ['1', '3']
AlphaSkips.append(Value) # ['1', '3']
# AlphaFinal ends as ['4','6','8', '2']
# AlphaSkips ends as ['1', '3']
# BravoFinal ends as ['5','7','9','1','3']
# BravoSkips ends as ['2']
Это отлично подходит для двух списков, но как я могу сделать это для 3 или 4 или более списков. Мне нужно, чтобы каждый из «Окончательных» списков был исключительным из всех остальных, и мне нужно, чтобы «Пропуски» были распределены как можно более равномерно.
Комментарии:
1. Если вы создадите список списков вместо отдельных списков, то обобщить это станет довольно легко.
2. Можете ли вы привести пример ввода и вывода? Если «перекрытие» существует в списках 3 и 4, имеет ли значение, появится ли оно в выходных данных для списка 1?
Ответ №1:
Что-то вроде этого-хорошее место для начала:
myList = []
myList.append( [<strings>] )
myList.append( [<strings>] )
myList.append( [<strings>] )
myList.append( [<strings>] )
overlap = set(myList[0])
for lst in myList:
overlap = overlap amp; set(lst)
finals = []
bumps = []
for lst in myList:
finals.append( [rec for rec in lst if rec not in overlap] )
bumps.append( [] )
for index, value in enumerate(overlap):
for i in range(len(finals)):
if i == index % len(finals):
finals[i].append(value)
else:
bumps[i].append(value)
Комментарии:
1. Спасибо за это. Это объединяет списки, но не отслеживает, кого выбивают из какого списка. Я добавил пример поведения к своему вопросу выше для разъяснения.
2. Это довольно простое дополнение, не так ли? Для каждого индекса один получает значение, остальные набираются. Вы должны были это добавить.