假设我有字符串,s='AADD'
。我使用了more_itertools
和distinct permutation,这将打印出(AADD,ADDA,DDAA,ADAD,DADA,DAAD)
。
我的问题是,因为AADD
和DDAA
,ADAD
和DADA
本质上是彼此的镜像,我想摆脱其中的一个,我应该如何修改我的代码来实现这一点?
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计算了所有可能的组合,有超过100亿种可能的组合,我想知道是否有更快的方法来完成这项任务。如果这个问题很愚蠢,请提前道歉,因为我没有上过任何编码课程,在做项目的同时我自己也在学习编码。
发布于 2018-06-26 06:19:12
这是一个不使用reverse
/ reversed
的解决方案。这是基于这样的逻辑:对于给定的字符串w
,w[::-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-26 06:01:41
一个简单的单行解决方案,不需要临时集合或列表,通过利用“大于或等于”运算符在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-26 05:28:33
您可以在此处使用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
https://stackoverflow.com/questions/51031968
复制相似问题