0

假设我有字符串,s='AADD'. 我使用more_itertools了不同的排列,它会打印出(AADD,ADDA,DDAA,ADAD,DADA,DAAD).

我的问题是,因为AADDand DDAA, ADADandDADA本质上是彼此的镜像,我想摆脱其中一个,我应该如何修改我的代码来实现这一点?

import more_itertools

s = 'AADD'
#counting = 0
for i in more_itertools.distinct_permutations(s):
    print(''.join(i))
    #counting += 1

更新:关于大量数据处理,我还有另一个问题。假设我的字符串“s”有 50 个字母而不是 4 个,我想知道“more_itertools”中的“distinct_permutation”是否是最有效的方法?我用 Mathematica 计算了所有可能的组合,有超过 10 亿种可能的组合,我想知道是否有更快的方法来完成这项任务。如果这个问题很愚蠢,请提前道歉,因为我没有参加任何编码课程,并且在做项目的同时正在学习自己编码。

4

3 回答 3

2

这是一个不使用reverse/的解决方案reversed。这适用于给定字符串的逻辑ww[::-1]将是反转字符串。

>>> import more_itertools
>>> s_list = list(map(''.join, more_itertools.distinct_permutations('AADD')))
>>> [w for w in s_list if w <= w[::-1]]
['ADDA', 'DAAD', 'ADAD', 'AADD']
于 2018-06-25T22:19:11.930 回答
1

一个简单的单行解决方案,不需要临时集合或列表,利用“大于或等于”运算符在 python 中的序列上工作的事实:

>>> from more_itertools import distinct_permutations
>>> [''.join(l) for l in distinct_permutations('AADD') if l >= l[::-1]]
['DDAA', 'DADA', 'ADDA', 'DAAD']
于 2018-06-25T22:01:41.087 回答
0

您可以reversed()在这里使用:

import more_itertools

s = 'AADD'

options = [i for i in more_itertools.distinct_permutations(s)]

no_mirrors = []
for i in options:
    if tuple(reversed(i)) not in no_mirrors:
        no_mirrors.append(i)

for i in no_mirrors:
    print(''.join(i))

输出:

DDAA
DADA
ADDA
DAAD
于 2018-06-25T21:28:33.317 回答