我只是在学习python,学习语言的最好方法是使用它,所以我想我会制作一个比较二进制单词的脚本来确定哪些是灰色的。
如果有一个不同的位,那么它应该标记记录哪个数字二进制代码。因此,举例来说,如果N = 3,则二进制代码为000,001,010,011,100,101,110,111
如果我选择我的第一个二进制代码为010,那么代码应该返回110,000,011作为结果,或者最好是指数0,3,6(或1,4,7)。
我的问题是:
最好的pythonic方法是什么,主要是我的目标是最快的代码。
我的理由是你们中的一些人会对最佳方法有更好的了解,然后我可以将我的代码与之比较,这会教会我更多。
答案 0 :(得分:2)
由于这是一个二进制计算问题(有一个奇怪的输入),它实际上并不是你可以应用 pythonic 工具的区域,如生成器,列表推导和itertools。
def neighbors(code, N=3):
num = int(code, 2)
return [num ^ (1 << (N-i-1)) for i in range(N)]
如果您希望对输出进行排序(例如0,3,6
而不是6,0,3
),请使用:
def neighbors_sorted(code, N=3):
num = int(code, 2)
return sorted(num ^ (1 << i) for i in range(N))
答案 1 :(得分:0)
我想发布我的初步尝试作为第一个答案,但网站阻止了我大约8小时,我现在只能回复了。我已将代码拆分为更重要的代码段。
这是我到目前为止的尝试:
我想我应该对下面的代码执行以下mod:
1) Use dicts so that I have 0:000,1:001,... to improve the indexing.
2) Take the comparison string, adapt it to a list of all possible options
then compare this to the full binary list e.g. 010 becomes 110,000,011
and this is then is compared to the full binary list.
我尝试创建二进制数列表如下(尚未使用dicts)
def BinaryNumberList(N=4):
Bins=[]
for Num in range(2**N):
Bin=''
for Pow in sorted(range(N),reverse=True):
Bin=Bin+str(Num/(2**Pow))
Num=Num-Num/(2**Pow)*2**Pow
Bins.append(Bin)
return Bins
然后运行for循环,将每个字符串与其余字符串进行比较(目前不是最好的字符串)
def GreySets(Bins):
for Bin1 in Bins :
for Bin2 in Bins :
stringXOR(Bin1,Bin2)
我从interwebs上的一些elses代码得到的字符串XOR,它返回一个TrueFalseTrue(我需要它来重新调整不匹配的位数)
def stringXOR(a, b):
# Error Checking
msg = "Strings do not have same length: %d, %d!"
assert len(a) == len(b), msg % (len(a), len(b))
cnt = len(a) - 1
# Code
result = ''
while cnt + 1:
result = `(a[cnt] != b[cnt])` + result
cnt = cnt - 1
return result