Частота элементов при попарном сравнении списков внутри списка в Python

У меня есть список таких списков:

my_list_of_lists = 
[['sparrow','sparrow','sparrow','junco','jay','robin'],
['sparrow','sparrow','junco', 'sparrow','robin','robin'],
['sparrow','sparrow','sparrow','sparrow','jay','robin']]

Я хотел бы сделать попарное сравнение в каждой позиции для всех списков с таким списком:

#1 with 2
['sparrow','sparrow','sparrow','junco','jay','robin']
['sparrow','sparrow','junco', 'sparrow','robin','robin']

#1 with 3
['sparrow','sparrow','sparrow','junco','jay','robin']
['sparrow','sparrow','sparrow','sparrow','jay','robin']

#2 with 3
['sparrow','sparrow','junco', 'sparrow','robin','robin']
['sparrow','sparrow','sparrow','sparrow','jay','robin']

Итак, пары для 1 с 2:

pairs =[('sparrow','sparrow'), ('sparrow','sparrow'), ('sparrow','junco'),('junco','sparrow'),('junco','junco'), ('jay','robin'), ('robin','robin')]

Я хотел бы получить количество и частоту пар в каждом попарном сравнении:

pairs =[('sparrow','sparrow'), ('sparrow','sparrow'), ('sparrow','junco'),('junco','sparrow') ('junco','junco'), ('jay','robin'), ('robin','robin')]

sparrowsparrow_counts = 2
juncosparrow_counts = 2
jayrobin_counts = 1
robinrobin = 1

frequency_of_combos = [('sparrow', 'sparrow'):.333, ('sparrow', 'junco'):.333, ('jay', 'robin'):.167, ('robin', 'robin'): .167]

Я пытался заархивировать, но в итоге я заархивировал все списки (не пары) в кортежи, а остальные запутались.

Я думаю, что это несколько связано с Как рассчитать количество и частоту для пар в списке списков? но я не могу понять, как применить это к моим данным.


person user14278898    schedule 13.10.2020    source источник
comment
Вы застегиваете пару диктовок; используйте структуру collections.Counter для подсчета пар. Разделите на общее количество. Теперь повторите это для каждой из трех пар списков.   -  person Prune    schedule 13.10.2020
comment
Спасибо за быстрый ответ. Чтобы убедиться, что я вас правильно понимаю, я бы создал словарь этих списков (то есть словарь списков), а затем использовал collections.Counter для подсчета пар для каждого попарного сравнения каждого списка. Разделив на сумму, я получу частоту. Что касается повторения, в полном наборе данных мне нужно перебрать около 75 из этих списков, поэтому я просматриваю словарь. Это правильная интерпретация?   -  person user14278898    schedule 13.10.2020
comment
Извините, заархивируйте пару из трех списков, а не новые словари. Если у вас есть 75 списков, я рекомендую вам использовать itertools.combinations(list_of_lists, 2) для создания пар списков.   -  person Prune    schedule 13.10.2020


Ответы (1)


Заархивируйте два списка, затем отфильтруйте пары, которые не совпадают, и используйте collections.Counter для их подсчета:

from collections import Counter

a = ['sparrow','sparrow','sparrow','junco','jay','robin']
b = ['sparrow','sparrow','junco', 'sparrow','robin','robin']
c = Counter([ i for i in zip(a,b) if i[0] == i[1]])
print(c)


Counter({('sparrow', 'sparrow'): 2, ('robin', 'robin'): 1})

Кажется, вы разобрались с частотной частью, но это должно прояснить использование zip и Counter.

person Matt Blaha    schedule 13.10.2020