Найдите совпадающие значения и их частоту из нескольких списков списков - PullRequest
0 голосов
/ 02 августа 2020

Я новичок в python. Предположим, у меня есть несколько списков (в данном случае 2). Пример:

Список A [ ['a', 'b', 'a', 'c', 'd'] , ['q', 'w', 'a', 'c'] ]

Список B [ ['a', 'p', 'z', 'c', 'q'] , ['a', 'l', 'k', 'j'] ].

Я хочу сравнить список A и list B, и найдите определенные c элементы вместе с их частотами, которые встречаются в обоих списках. В этом случае я хочу, чтобы ответ был «q», «a» и «c». Но я не хочу считать, что «a» встречается в списке A или в любом из подсписков списка A.

Учитывая элемент «a» из списка A, я просто хочу знать, действительно ли «a» 'также можно увидеть в списке B и считать это вхождение как частота = 2, но скажем, что' b 'можно увидеть только в списке A, поэтому его частота равна только 1. Я также хочу знать названия списков, в которых был замечен элемент, поэтому для 'a' ответом будут List A и List B, но для 'b' это только List A.

Основная интуиция c состоит в том, чтобы отслеживать значения, которые более разбросаны (то есть присутствуют в большем количестве списков) по сравнению с другими значениями. Есть ли эффективный способ сделать это? Любая помощь приветствуется, спасибо!

1 Ответ

1 голос
/ 02 августа 2020

В следующих отчетах учитывается количество вхождений элементов в списках

def flatten(lst):
    " Flattens into single lists "
    return [val for sublist in lst for val in sublist]

def occurences(*lsts):
    " Takes in an arbitrary number of lists and reports frequencies of items "
    result = {}
    for i, lst in enumerate(lsts):
        f_lst = flatten(lst)
        for c in f_lst:
            result.setdefault(c, set()).add(i)
    # Add frequencies
    # key frequency is the count
    # key occurs is which numbered list of the item
    final = {}
    for c, s in result.items():
        final[c] = {'frequency': len(s), 'occurs':list(s)}
    return final

Использование

stats = occurrences(List1, List2, ..., ListN)

Тест

Тест 1 (ListA и ListB являются ссылками как 0, встречается 1)

ListA = [ ['a', 'b', 'a', 'c', 'd'] , ['q', 'w', 'a', 'c'] ]
ListB = [ ['a', 'p', 'z', 'c', 'q'] , ['a', 'l', 'k', 'j'] ]
from pprint import pprint as pp
pp(occurences(ListA, ListB))
{'a': {'frequency': 2, 'occurs': [0, 1]},
 'b': {'frequency': 1, 'occurs': [0]},
 'c': {'frequency': 2, 'occurs': [0, 1]},
 'd': {'frequency': 1, 'occurs': [0]},
 'j': {'frequency': 1, 'occurs': [1]},
 'k': {'frequency': 1, 'occurs': [1]},
 'l': {'frequency': 1, 'occurs': [1]},
 'p': {'frequency': 1, 'occurs': [1]},
 'q': {'frequency': 2, 'occurs': [0, 1]},
 'w': {'frequency': 1, 'occurs': [0]},
 'z': {'frequency': 1, 'occurs': [1]}}

Тест 2 (ListA, ListB, List C упоминается как 0, 1, 2 встречается)

ListA = [ ['a', 'b', 'a', 'c', 'd'] , ['q', 'w', 'a', 'c'] ]
ListB = [ ['a', 'p', 'z', 'c', 'q'] , ['a', 'l', 'k', 'j'] ]
ListC = [ ['m', 'p', 'r', 's', 'q'] , ['a', 't', 'k', 'j'] ]
from pprint import pprint as pp
pp(occurences(ListA, ListB, ListC))

{'a': {'frequency': 3, 'occurs': [0, 1, 2]},
 'b': {'frequency': 1, 'occurs': [0]},
 'c': {'frequency': 2, 'occurs': [0, 1]},
 'd': {'frequency': 1, 'occurs': [0]},
 'j': {'frequency': 2, 'occurs': [1, 2]},
 'k': {'frequency': 2, 'occurs': [1, 2]},
 'l': {'frequency': 1, 'occurs': [1]},
 'm': {'frequency': 1, 'occurs': [2]},
 'p': {'frequency': 2, 'occurs': [1, 2]},
 'q': {'frequency': 3, 'occurs': [0, 1, 2]},
 'r': {'frequency': 1, 'occurs': [2]},
 's': {'frequency': 1, 'occurs': [2]},
 't': {'frequency': 1, 'occurs': [2]},
 'w': {'frequency': 1, 'occurs': [0]},
 'z': {'frequency': 1, 'occurs': [1]}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...