Python 计算每个元素的排列数

Python 计算每个元素的排列数,python,permutation,Python,Permutation,我需要一些帮助。我查了一下,关于“计算排列”的问题很少,但我没有找到适合我的情况的答案 我想计算项目列表中每个项目的排列总数。比如说,您有两个列表(“第一”、“第二”见下文),对于“第一”的每个元素,我想知道其唯一排列的总数。e、 在“第一”中,g代表“a” ab 交流电 公元 ab 交流电 公元 ab ab 通过删除重复项,我们可以 ab ac ad 所以“a”的排列数将是“3” 我希望得到的最终结果应该是 (a,3) (b,3) (c,3) (d,3) 我从 import itertools

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

我想计算项目列表中每个项目的排列总数。比如说,您有两个列表(“第一”、“第二”见下文),对于“第一”的每个元素,我想知道其唯一排列的总数。e、 在“第一”中,g代表“a”

ab 交流电 公元 ab 交流电 公元 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
列表中每个元素的不同计数,计数器的结果高于预期输出。我不知道我做错了什么


有什么帮助吗?

好吧,问题仍然不太清楚,但这里是我的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}       

这个问题还不是很清楚,但我的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}       

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

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
    ,以备将来检查
  • 将打印循环从第二个输入循环的
    中取出。因此,每个计数器在最后只打印一次

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

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
    ,以备将来检查
  • 将打印循环从第二个输入循环的
    中取出。因此,每个计数器在最后只打印一次


你的问题毫无意义。您想删除重复项,但当您显示所需的输出时,它有3个b、3个c和3个d,而在删除重复项后,每个输出只有一个。我也不明白您想做什么。在你的文字描述中,我看不出第二个列表的作用。请直接以python代码的形式编写输入和预期的输出。如果您对
[a,b,c,d]
进行排列,那么对于所有带有
a
的输入,您将不会得到
ab ac ad ab ac ad ab
。那里有一对多余的,其中一半不会以
a
开头。但是,您将获得
ab ac ad ba ca da
。你在寻找组合吗?对于同样出现在任何“第二”子列表中的“第一”的每个元素,我想计算它的置换总数,没有重复。这意味着,如果有
ac
它将计数一。现在希望很明显SirParselot只是想验证
ac ca
是否算作一个(组合)或两个(排列)。你的问题没有意义。您想删除重复项,但当您显示所需的输出时,它有3个b、3个c和3个d,而在删除重复项后,每个输出只有一个。我也不明白您想做什么。在你的文字描述中,我看不出第二个列表的作用。请直接以python代码的形式编写输入和预期的输出。如果您对
[a,b,c,d]
进行排列,那么对于所有带有
a
的输入,您将不会得到
ab ac ad ab ac ad ab
。那里有一对多余的,其中一半不会以
a
开头。但是,您将获得
ab ac ad ba ca da
。你在寻找组合吗?对于同样出现在任何“第二”子列表中的“第一”的每个元素,我想计算它的置换总数,没有重复。这意味着,如果有
ac
它将计数一。现在希望很明显,SirParselot只是想验证
ac ca
是否算作一个(组合)或两个(排列)。这对我来说可能是一个很好的起点。除非我错过了什么,否则我会期待
{'a':3,'c':3,'b':3,'d':3,'j':0}
a
abcd
ab
acd
abd
,因此计数是
4
。与
c
相同。我认为它符合您的规格。我的输入数据与您的示例不一样,可能您只是混合了它们。谢谢。我刚刚得到了一个答案(见上文),它解决了我的问题,听起来不是以自我为中心,但如果它像预期的那样工作,你应该标记我的:它是第一位的,而且它更优雅、更有趣efficient@dcpula:bgusach是对的。我对你的问题做了一些编辑以提高可读性(如果你同意,将提交该版本)。我建议你阅读一些技巧,让问题更具可读性。也欢迎您在中查看,以了解更多有关StackOverflow如何工作的信息。这可能是我的一个很好的起点。除非我错过了什么,否则我会期待
{'a':3,'c':3,'b':3,'d':3,'j':0}
a
abcd
ab
acd
abd
,因此计数是
4
。与
c
相同。我认为它符合您的规格。我的输入数据与您的示例不一样,可能您只是混合了它们。谢谢。我刚刚得到了一个答案(见上文),它解决了我的问题,听起来不是以自我为中心,但如果它像预期的那样工作,你应该标记我的:它是第一位的,而且它更优雅、更有趣efficient@dcpula:bgusach是对的。我对你的问题做了一些编辑以提高可读性(如果你同意,将提交该版本)。我建议你阅读一些技巧,让问题更具可读性。也欢迎您查看以了解更多信息