使用Python3和Python2的结果不同

时间:2017-08-09 20:37:32

标签: python python-2.7 python-3.x

这是我测试的代码:

def rule(n):
    rules_numbers = {128: 'xxx', 64: 'xx.', 32: 'x.x', 16: 'x..',
                     8: '.xx', 4: '.x.', 2: '..x', 1: '...'}
    rules = {'...': '.', '..x': '.', '.x.': '.', '.xx': '.', 'x..': '.', 'x.x': '.', 'xx.': '.', 'xxx': '.'}
    while n != 0:
        for r in rules_numbers:
            if n - r >= 0:
                rules[rules_numbers[r]] = 'x'
                n -= r
                break
    return rules


def cellular_automaton(string, pattern, n):
    if n == 0:
        return string
    rules = rule(pattern)
    ng = ""
    for j in range(len(string)):
        nxt = j + 1
        if j == len(string) - 1:
            nxt = 0
        ng += rules[string[j - 1] + string[j] + string[nxt]]
        j += 1
    return cellular_automaton(ng, pattern, n - 1)

以下是一些示例输入和代码正确时我们应该得到的输出:

print(cellular_automaton('.x.x.x.x.', 17, 2))
#>>> xxxxxxx..
print(cellular_automaton('.x.x.x.x.', 249, 3))
#>>> .x..x.x.x
print(cellular_automaton('...x....', 125, 1))
#>>> xx.xxxxx
print(cellular_automaton('...x....', 125, 2))
#>>> .xxx....
print(cellular_automaton('...x....', 125, 3))
#>>> .x.xxxxx
print(cellular_automaton('...x....', 125, 4))
#>>> xxxx...x
print(cellular_automaton('...x....', 125, 5))
#>>> ...xxx.x
print(cellular_automaton('...x....', 125, 6))
#>>> xx.x.xxx
print(cellular_automaton('...x....', 125, 7))
#>>> .xxxxx..
print(cellular_automaton('...x....', 125, 8))
#>>> .x...xxx
print(cellular_automaton('...x....', 125, 9))
#>>> xxxx.x.x
print(cellular_automaton('...x....', 125, 10))
#>>> ...xxxxx

以下是解释我试图解决的问题的视频:https://youtu.be/M_pkidxeGMY

当我使用Python3运行此代码时,我得到所有输出,当我使用Python2时,我得到不同的结果。 你能告诉我,代码的哪一部分有所不同?谢谢!

来自Python2的

resluts:

..xxxxxxx
.x.xxxxxx
xxx..xxx
..x.x...
xx....xx
.x.xxx..
x....x.x
x.xxx...
....x.xx
.xxx...x
...x.xx.
xxx...x.

1 个答案:

答案 0 :(得分:3)

您的rules()函数产生不同的结果,因为它依赖于字典迭代顺序。字典没有排序,对密钥的迭代是implementation dependent。 Python 3.6切换实现,例如迭代顺序也改变了。

对于你的第一条规则,第17条,我得到以下结果:

Python 2.7:

>>> sorted(rule(17).items())
[('...', 'x'), ('..x', 'x'), ('.x.', '.'), ('.xx', '.'), ('x..', '.'), ('x.x', '.'), ('xx.', '.'), ('xxx', '.')]

Python 3.6:

>>> sorted(rule(17).items())
[('...', 'x'), ('..x', '.'), ('.x.', '.'), ('.xx', '.'), ('x..', 'x'), ('x.x', '.'), ('xx.', '.'), ('xxx', '.')]

请注意'..x'如何映射到一个'.',另一个'x'

您必须更改规则功能才能生成固定订单。您可以对键进行排序,例如:

for r in sorted(rules_numbers):

现在所有Python版本都会产生相同的输出:

>>> sorted(rule(17).items())
[('...', 'x'), ('..x', '.'), ('.x.', '.'), ('.xx', '.'), ('x..', '.'), ('x.x', '.'), ('xx.', '.'), ('xxx', '.')]