如何检查 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 非常大,这可能会成为问题。