【问题标题】:Returning the X+1 item in a list of strings返回字符串列表中的 X+1 项
【发布时间】:2013-11-01 17:50:38
【问题描述】:

到目前为止,我有一个创建格雷码的函数,然后我需要创建一个返回格雷码“加一”的函数,基本上是按顺序返回的下一个。所以如果 D = (0,0,1,1) 我需要返回 (0,0,1,0)

我有

def gray(x):
    if x:
        return ['0' + x[0]] + gray(x[1:]) + ['1' + x[0]]
    else:
        return []

def graycode(n):
    if n:
        return gray(graycode(n-1))
    else:
        return ['']

最后,

def GrayFinal(D):
    z = ''.join(map(str,D))
    str(z)
    if z in graycode(len(D)):
        return graycode(len(D))[z+1]
    else:
        return ['']

我不知道如何返回 Zth+1 条目

【问题讨论】:

  • 可能是一个确保您的缩进在帖子中正确表示的想法......它在复制/粘贴时无法很好地保存......
  • 是的,我注意到了,感谢您的修复!
  • 你的意思是“如何将灰度代码增加 1”?
  • 我在 Google 上找到了这个。这对你有用吗? barricane.com/python-grey-code-algorithm.html
  • 是的,前两个函数我只是试图获得所需的 n 位,然后是我想要返回下一个格雷码增量的最后一个函数。所以 GrayFinal((0,0,1,1)) 我想返回 (0,0,1,0)。

标签: python string python-2.7 indexing


【解决方案1】:

如果我正确解释了您的问题,那么您问题的核心与格雷码无关,而是与更一般的问题“给定我希望在 Python 列表中找到的元素,如何之后我检索下一个元素?"

不幸的是,我现在只能想出一个相当脑残的解决方案

def next_elem(elem, input_list):
    index = input_list.index(elem)
    return input_list[index + 1]

请注意,这绝对不支持错误检查,我假设在您的情况下将在代码主体中完成。将其放入您的代码中会导致以下结果:

def GrayFinal(D):
    z = ''.join(map(str,D))
    try:
        return next_elem(z, graycode(len(D)))
    except ValueError:
        # Doesn't look like z was ever in the Gray code generated
        return ['']
    except IndexError:
        # The next element is beyond the last element of the array!
        return next_elem('0' + z, graycode(len(D) + 1))

【讨论】:

  • 啊,是的,该元素超出了数组的最后一个元素。当我编写函数时仍然会绊倒我。感谢您的提醒!
  • Eh... 我忘了在 IndexError 的情况下实际做任何事情。现在已经解决了。我仍在尝试是否有更漂亮的方法来做到这一点。
  • 非常感谢您的帮助。我正在尝试删除 if 语句,但我认为我什至不需要“str(z)”
  • 顺便说一句,我知道您的问题是特定于您的实现的,但是如果您希望改进算法本身,我认为最终类似于@User 建议的东西是最好的(即灰度到二进制,递增,然后转换回灰度)。它消除了生成与所讨论的数字具有相同位数的所有格雷码的需要。
  • 好的,我明白了。谢谢您的帮助。非常感谢!
【解决方案2】:

这是我听说的:

>>> bin2gray = lambda x: (x >> 1) ^ x # create graycode
>>> for i in range(10):
    print(bin(bin2gray(i))[2:].zfill(4))


0000
0001
0011
0010
0110
0111
0101
0100
1100
1101

>>> def gray2bin(g):
    bits = list(map(int, bin(g)[2:]))
    n = [0]
    for bit in bits:
        if not n[-1]:
            n.append(bit)
        else:
            n.append(1 - bit)
    return sum([n[i] << (-1 - i) for i in range(-len(n), 0)])

>>> def inc(g):
    return bin2gray(gray2bin(g) + 1)

如果您希望它使用字符串而不是整数,则需要调整 inc 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-06
    • 2011-07-20
    • 2013-04-12
    • 1970-01-01
    • 2021-06-24
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多