Перекрытие дорожек при слиянии списков в Python

#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. Это довольно простое дополнение, не так ли? Для каждого индекса один получает значение, остальные набираются. Вы должны были это добавить.