Частота записи Python при комбинировании комбинаций - PullRequest
0 голосов
/ 26 августа 2018

Я начал использовать python для проекта для домашних животных, так как организация этих данных была невозможна в такой программе, как excel.Я надеюсь, что вы можете дать мне несколько советов о том, как добиться результата, который я ищу.Прошу прощения за отсутствие у меня грамотности на Python.

У меня есть следующий код, который я упростил, уменьшив количество списков и количество элементов в этих списках, чтобы упростить их иллюстрацию.

import itertools
from collections import Counter

a = list(itertools.permutations([32,36,41],3))
b = list(itertools.permutations([36,32,41],3))
c = list(itertools.permutations([19,31,7],3))

fulllist = a+b+c

print(Counter(map(tuple, fulllist)))

, который дает следующий результат:

Counter({(32, 36, 41): 2, (32, 41, 36): 2, (36, 32, 41): 2, (36, 41, 32): 2, (41, 32, 36): 2, (41, 36, 32): 2, (19, 31, 7): 1, (19, 7, 31): 1, (31, 19, 7): 1, (31, 7, 19): 1, (7, 19, 31): 1, (7, 31, 19): 1})

Это уже довольно хорошо, но не совсем то, что мне нужно.Теперь, когда у меня есть первый счет каждой списочной комбинации, сгенерированной intertools, меня больше не волнует порядок каждого элемента внутри указанного списка.Итак, окончательный результат, который я хотел бы получить:

(32, 36, 41): 12 
(19, 31, 7): 6 

И отсортирован, как я уже писал выше.Я чувствую, что могу ходить кругами и, возможно, есть более простой способ получить результат, который я ищу.На самом деле мои списки содержат 15 элементов, и у меня есть около 50 таких списков для обработки.

Я надеюсь, что вы можете помочь мне с этим.Заранее большое спасибо.

Ответы [ 3 ]

0 голосов
/ 26 августа 2018

Если вы не учитываете перестановки (в этом случае используйте ответ @ Martin), и это было просто использовано для создания списка примеров, просто сортируйте, чтобы сделать его понятным, порядок не имеет значения:

>>>print(Counter(tuple(sorted(x)) for x in fulllist))
Counter({(32, 36, 41): 12, (7, 19, 31): 6})
0 голосов
/ 26 августа 2018
c = Counter(map(tuple, fulllist))
l = [ {tuple(sorted(i[0])):i[1]} for i in c.items()]  

for e in l:
    print(e)  

{(32, 36, 41): 2}
{(32, 36, 41): 2}
{(32, 36, 41): 2}
{(32, 36, 41): 2}
{(32, 36, 41): 2}
{(32, 36, 41): 2}
{(7, 19, 31): 1}
{(7, 19, 31): 1}
{(7, 19, 31): 1}
{(7, 19, 31): 1}
{(7, 19, 31): 1}
{(7, 19, 31): 1}
0 голосов
/ 26 августа 2018

Если все, что вам нужно, это количество возможных перестановок, то просто рассчитайте эти числа.Это число является просто факториалом длины ввода:

import math

permutationcount = math.factorial(len(inputlist))

Если вы создаете перестановки, которые на короче , чем len(inputlist) (скажем, 3 из 20), тогдаформула имеет вид n! / (n - k)!:

n = len(inputlist)
k = 3
permutationcount = math.factorial(n) // math.factorial(n - k)

Конечно, когда k равен n, вы делите на 0 !, что равно 1.

Вы можете отсортироватьсписок ввода и превратить его в кортеж, чтобы создать ключ в отображении:

from collections import Counter

def count_permutations(lists, k=None):
    counts = Counter()
    if k is None:
        k = len(lists[0])
    for l in lists:
        key = tuple(sorted(l))
        permutationcount = math.factorial(len(l)) // math.factorial(len(l) - k)
        counts[key] += permutationcount
    return counts

Демо:

>>> count_permutations(([32,36,41], [36,32,41], [19,31,7]), k=3)
Counter({(32, 36, 41): 12, (7, 19, 31): 6})

Вам на самом деле не нужно использовать Counter здесь, конечно, но это может быть удобно в любом случае, если вам нужен метод .most_common() и вы не хотите искать способ сортировки словаря по значению.

...