如何检查 Python 中列表中的两个数字是否相同
how to check if two numbers in a list are the same in Python
我的一些编码有点问题。
这是我的代码:
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
例如,如果我填写 sites("321"),此代码将为我提供列表 [1, 1, 1]。我想要做的是检查此列表中是否有相同的数字。我在想类似的事情:
if modulo[0] != modulo[1] != modulo[2]:
print "valid"
else:
print "invalid"
这仅适用于站点中的输入长度为三位数的情况。我一直在集思广益如何使用 while 循环来检查每个数字。
非常欢迎大家的帮助。
您可以使用一个集合来删除任何重复项并对照原始列表检查之后的长度:
if len(set(modulo)) == len(modulo): # if lengths are equal we have no duplicate nums
print "valid"
else:
print "Invalid"
如果你只是想避免添加重复项,请在添加之前保留一组可见的所有数字并进行检查:
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
所以我知道你得到了答案,但我只是想插话并展示一个更优化的方法来解决你的问题。这将使您不会多次循环遍历字符串,如果它无效,您甚至可能不会提前停止。
如果值不在列表中,您可以创建一个生成器并通过它循环添加到 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 个列表,如果您的初始 string/list 非常大,这可能会成为问题。
我的一些编码有点问题。 这是我的代码:
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
例如,如果我填写 sites("321"),此代码将为我提供列表 [1, 1, 1]。我想要做的是检查此列表中是否有相同的数字。我在想类似的事情:
if modulo[0] != modulo[1] != modulo[2]:
print "valid"
else:
print "invalid"
这仅适用于站点中的输入长度为三位数的情况。我一直在集思广益如何使用 while 循环来检查每个数字。
非常欢迎大家的帮助。
您可以使用一个集合来删除任何重复项并对照原始列表检查之后的长度:
if len(set(modulo)) == len(modulo): # if lengths are equal we have no duplicate nums
print "valid"
else:
print "Invalid"
如果你只是想避免添加重复项,请在添加之前保留一组可见的所有数字并进行检查:
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
所以我知道你得到了答案,但我只是想插话并展示一个更优化的方法来解决你的问题。这将使您不会多次循环遍历字符串,如果它无效,您甚至可能不会提前停止。
如果值不在列表中,您可以创建一个生成器并通过它循环添加到 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 个列表,如果您的初始 string/list 非常大,这可能会成为问题。