Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何生成只有';x'';y';Python中的给定长度n是多少?_Python_Palindrome - Fatal编程技术网

如何生成只有';x'';y';Python中的给定长度n是多少?

如何生成只有';x'';y';Python中的给定长度n是多少?,python,palindrome,Python,Palindrome,是否有任何模式可用于排序如何创建由“X”“Y”组成的回文字符串让我们假设n是偶数。生成由x和y组成的长度为n/2的每个字符串,并附加其镜像以获得回文 练习1:证明这会生成长度n的所有回文 练习2:找出当n为奇数时该怎么办。首先生成所有可能的字符串,给出一个字符列表: >>> from itertools import product >>> characters = ['x','y'] >>> n = 5 >>> [''.j

是否有任何模式可用于排序如何创建由“X”“Y”组成的回文字符串

让我们假设
n
是偶数。生成由
x
y
组成的长度为
n/2
的每个字符串,并附加其镜像以获得回文

练习1:证明这会生成长度
n
的所有回文


练习2:找出当
n
为奇数时该怎么办。

首先生成所有可能的字符串,给出一个字符列表:

>>> from itertools import product
>>> characters = ['x','y']
>>> n = 5
>>> [''.join(i) for i in product(characters, repeat=n)]
['xxxxx', 'xxxxy', 'xxxyx', 'xxxyy', 'xxyxx', 'xxyxy', 'xxyyx', 'xxyyy', 'xyxxx', 'xyxxy', 'xyxyx', 'xyxyy', 'xyyxx', 'xyyxy', 'xyyyx', 'xyyyy', 'yxxxx', 'yxxxy', 'yxxyx', 'yxxyy', 'yxyxx', 'yxyxy', 'yxyyx', 'yxyyy', 'yyxxx', 'yyxxy', 'yyxyx', 'yyxyy', 'yyyxx', 'yyyxy', 'yyyyx', 'yyyyy']
然后过滤掉非回文:

>>> n = 4
>>> [''.join(i) for i in product(characters, repeat=n) if i[:n/2] == i[::-1][:n/2]]
['xxxx', 'xyyx', 'yxxy', 'yyyy']
>>> n = 5
>>> [''.join(i) for i in product(characters, repeat=n) if i[:n/2] == i[::-1][:n/2]]
['xxxxx', 'xxyxx', 'xyxyx', 'xyyyx', 'yxxxy', 'yxyxy', 'yyxyy', 'yyyyy']
如果不喜欢列表理解中的If条件,可以使用
filter()


提示:我有一些长度为n/2的字符串。这可以用来构造长度为n的回文吗?@IfLoop:评论不错,希望我在发布答案之前看到它。会让事情变得更微妙一点当n为奇数时,只需让中间的一个为x或y,然后将x/y附加到每个长度为(n-1)/2的字符串及其反向版本,对吗?@user3426141:Yes(由“x或y”提供,您的意思是“x和y的每一个”)。不知道从哪里开始生成字符串,基本大小写应该是n=0和1?@user3426141:有很多方法可以做到这一点:递归;通过生成介于0和2**n-1之间的整数并查看其二进制表示(0->x,1->y);使用
itertools.product
;等等。拿你的选择。@user3426141你总是可以使用一个列表,并在最后把它做成一个字符串,如果这能让你的船更好地漂浮的话。但是没有必要,你可以用一种完全功能化的方式来实现它(没有变异),我认为你的过滤器是错误的。至少
xyxy
不是palindrome@NiklasB. 感谢您捕捉到这一点,忘记反转子列表=)
>>> from itertools import product
>>> characters = ['x','y']
>>> n = 5
>>> def ispalindrome(x): return x[:n/2] == x[::-1][:n/2];
>>> filter(ispalindrome, [''.join(i) for i in product(characters, repeat=n)])
['xxxxx', 'xxyxx', 'xyxyx', 'xyyyx', 'yxxxy', 'yxyxy', 'yyxyy', 'yyyyy']