计算每个元素的排列数

时间:2016-02-11 14:46:42

标签: python permutation

我需要一些帮助。我查了一下,关于“计算排列”的问题很少,但我找不到适合我案例的答案。

我想计算项目列表中每个项目的排列总数。比如说,你有两个列表('第一个','第二个'见下文),对于'first'的每个元素,我想拥有它的唯一排列总数。例如,'first'中的'a'我们有

  

AB   AC   广告   AB   AC   广告   AB   AB

删除重复项,我们有

  

ab ac ad

因此'a'的排列数将为'3'

我想得到的最终结果应该是

  

(a,3)

     

(b,3)

     

(c,3)

     

(d,3)

我从

开始
import itertools
from collections import Counter
first = ['a','b','c','d']
second = [['a','b','c','d'], ['a','b'], ['a','c','d'], ['a','b','d']]
c = Counter()
for let in second:
      letPermut = list(set(itertools.permutations(let, 2)))
      for i in first:
          for permut in letPermut:
                 if permut[0] == i:
                        c[i] += 1
      for item in c.items():
          print(item)

但是在输出中,我得到first列表中每个元素的不同计数,并且Counter的结果高于预期输出。我不知道我做错了什么。

任何帮助?

2 个答案:

答案 0 :(得分:2)

嗯,问题仍然不是很明确,但这里是我的0.02 $:

def do_the_stuff(first, second):
    second = list(set(second))

    return {
        el1: sum(1 for el2 in second if el1 in el2)
        for el1 in first
    }

有一些测试数据:

>>> first = ['a','b','c','d', 'j']
>>> second = ['abcd', 'ab', 'ab', 'acd', 'abd']
>>> print do_the_stuff(first, second)
{'a': 4, 'c': 2, 'b': 3, 'd': 3, 'j': 0}       

答案 1 :(得分:1)

如果我确实理解您的问题,这些更改会使您的代码忽略重复的排列:

import itertools
from collections import Counter
first = ['a','b','c','d']
second = [['a','b','c','d'], ['a','b'], ['a','c','d'], ['a','b','d']]
uniques = []
c = Counter()
for let in second:
    letPermut = list(set(itertools.permutations(let, 2)))
    for i in first:
        for permut in letPermut:
            if permut[0] == i and not permut in uniques:
                c[i] += 1
                uniques.append(permut)
for item in c.items():
    print(item)

变化:

  • 声明名为uniques
  • 的空列表
  • 如果在计算+1
  • 之前排列是重复的,我们会检查uniques
  • 在增加计数器后,我们将排列添加到uniques以供将来检查
  • for let in second循环中取出打印循环。因此,每个计数器最后只打印一次。