Непонятно, как обрабатываются дубликаты при пересечении списков, содержащих повторяющиеся элементы, так как вы дали только один тестовый пример и его ожидаемый результат, и вы не объяснили обработку дубликатов.
В соответствии с тем, как в настоящее время работают дубликаты, общими элементами являются 'a'
и 'b'
, а списки перечней пересечений 'a'
с кратностью 1 и 'b'
с кратностью 2. Примечание 'a'
встречается один раз в обоих списках a и b , но 'b'
встречается дважды на b .Список пересечений перечисляет общий элемент с кратностью, равной списку, имеющему этот элемент с кратностью максимум .
Ответ - да .Тем не менее, цикл может быть вызван неявно - хотя вы хотите, чтобы ваш код не использовал явно операторы цикла.Этот алгоритм, однако, всегда будет итеративным.
Шаг 1: Создайте набор пересечений, Intersect
, который не содержит дубликатов (вы уже сделали это).Преобразование в список для сохранения индексации.
Шаг 2: Создайте второй массив, IntersectD
.Создайте новую переменную Freq
, которая подсчитывает максимальное количество вхождений для этого общего элемента, используя count
.Используйте Intersect
и Freq
для добавления элемента Intersect[k]
несколько раз в зависимости от его соответствующего Freq[k]
.
Пример кода с 3 списками будет
a = ['a','b','c','1','1','1','1','2','3','o']
b = ['a','b','b','o','1','o','1']
c = ['a','a','a','b','1','2']
intersect = list(set(a) & set(b) & set(c)) # 3-set case
intersectD = []
for k in range(len(intersect)):
cmn = intersect[k]
freq = max(a.count(cmn), b.count(cmn), c.count(cmn)) # 3-set case
for i in range(freq): # Can be done with itertools
intersectD.append(cmn)
>>> intersectD
>>> ['b', 'b', 'a', 'a', 'a', '1', '1', '1', '1']
Для случаев, включающих более двух списков, freq
для этого общего элемента может быть вычислено с использованием более сложного пересечения множеств и выражения max.Если используется список списков, freq
может быть вычислено с использованием внутреннего цикла.Вы также можете заменить внутренний i-цикл выражением itertools из Как подсчитать вхождения элемента списка? .