2

我有这两个功能:

def comparison(a, b):
    return [-1, 0, 1].index(cmp(b, a))

def base_3(seq):
    return [comparison(a, b) for a, b in itertools.combinations(seq, 2)]

函数比较基于此返回一个比较数:

  1. 0 如果 a > b
  2. 1 如果 a = b
  3. 2 如果 a < b

函数 base_3 返回所有组合元素之间的比较。

例如:

x = [0, 1, 2]
y = [1, 2, 0]
z = [0, 1, 0]

>>> base_3(x)
[2, 2, 2]

>>> base_3(y)
[2, 0, 0]

>>> base_3(z)
[2, 1, 0]

如果可能,我需要一个从给定 base_3 返回序列的函数:

>>> base_3_to_seq([2, 2, 2])
[0, 1, 2]

>>> base_3_to_seq([2, 1, 0])
[0, 1, 0]

>>> base_3_to_seq([0, 2, 1])
"Impossible"

如何编写这个函数 base_3_to_seq?

4

1 回答 1

2

这是一种蛮力的方式:

def base_3_to_seq(base3):
   for seq in itertools.product(range(3), repeat=3):
       if base_3(seq) == base3:
           return seq
   return "Impossible"

根据您最常调用它的方式,您可以通过记忆 base_3 或 base_3_to_seq 来加快代码的长期运行速度。

于 2012-04-13T15:29:53.380 回答