如何在Python中检查列表中的两个数字是否相同
我在一些编码方面有点问题。 这是我的代码:如何在Python中检查列表中的两个数字是否相同,python,string,python-2.7,while-loop,int,Python,String,Python 2.7,While Loop,Int,我在一些编码方面有点问题。 这是我的代码: 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
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
这仅在站点中的输入为三位数时有效。我一直在讨论如何使用while循环来检查每个数字
非常欢迎提供所有帮助。您可以使用集合删除任何DUP,并对照原始列表检查DUP后的长度:
if len(set(modulo)) == len(modulo): # if lengths are equal we have no duplicate nums
print "valid"
else:
print "Invalid"
如果您只是想避免添加DUP,请在添加前查看并检查一组所有NUM:
seen = set()
if num not in seen: add it
我还避免使用sum作为变量名,因为它会隐藏内置的pythonsum
函数
您还可以使用枚举
,范围
,不需要在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
或者最好再次使用:
所以我知道你得到了答案,但我只是想插嘴,展示一种更优化的方法来解决你的问题。这将允许您不在字符串中循环多次,如果字符串无效,您甚至可能不会提前停止 如果值不在列表中,您可以创建一个生成器并通过它循环添加到
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个列表,如果初始字符串/列表非常大,则可能会出现问题。非常感谢!我花了两个多小时思考如何解决这个问题,你在提出问题的头两分钟内就提出了一个聪明的解决方案。我无法表达我的感激之情。祝您愉快:)这不是一个真正有效的解决方案,因为您使用的是列表,所以查找是
0(n)
而不是我建议的0(1)
集,最坏的情况是,您仍然创建了第二个列表seen
,然后将其丢弃,而没有快速查找的好处,我同意,我更多考虑的是内存使用,而不是原始速度。我把它改成了一个集合,这样现在它的内存效率更高,速度更快:)是的,集合对更大的输入产生了影响。
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
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'