我对某些编码有点问题。 这是我的代码:
def sites(x):
r = []
sum = 0
i = 0
modulo = []
som = 0
j = 0
while i < len(x):
sum = int(float(x[i])) + (i + 1)
r.append(sum)
i = i + 1
while j < len(x):
som = r[j] % len(x)
modulo.append(som)
j = j + 1
return modulo
如果我填写网站(“321”),这段代码会给我列表[1,1,1]。我想要做的是检查此列表中的数字是否相同。我在考虑类似的事情:
if modulo[0] != modulo[1] != modulo[2]:
print "valid"
else:
print "invalid"
仅当站点中的输入长度为三位时才有效。我一直在集思广益,讨论如何使用一个检查每个数字的while循环。
非常欢迎所有帮助。
答案 0 :(得分:3)
您可以使用一个集删除任何重复项并检查原始列表后的长度:
if len(set(modulo)) == len(modulo): # if lengths are equal we have no duplicate nums
print "valid"
else:
print "Invalid"
如果你只是想避免添加重复,请在添加之前保持一组所有的nums,并检查:
seen = set()
if num not in seen: add it
我还会避免使用sum作为变量名,因为它会影响内置的python sum
函数。
您也可以使用enumerate
,range
,而不需要在python中声明变量:
def sites(x):
r = []
modulo = []
ln = len(x)
for i,ele in enumerate(x):
sm = int(float(ele)) + (i + 1)
r.append(sm)
for j in range(ln):
som = r[j] % ln
modulo.append(som)
return modulo
或者最好再次使用list comprehensions:
def sites(x):
ln = len(x)
r = [int(float(ele)) + (i + 1) for i,ele in enumerate(x)]
modulo = [r[j] % ln for j in range(ln)]
return modulo
答案 1 :(得分:2)
所以我知道你得到了答案,但我只是想插手并为你的问题展示更优化的方法。这样你就不会多次遍历字符串,如果它无效,你甚至可能不会提前停止。
如果值不在列表中,您可以创建一个生成器并在其中循环添加seen
列表:
gen = ((int(float(ele)) + (i + 1)) % len(x) for i,ele in enumerate(x))
seen = set()
for i in gen:
if i in seen:
print 'invalid'
break
seen.add(i)
else:
print 'valid'
这样做的另一个好处就是不在内存中创建额外的1-2个列表,如果你的初始字符串/列表非常大,这可能是个问题。