如何检查列表中的两个数字在Python中是否相同

时间:2015-02-21 01:48:34

标签: 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 = 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循环。

非常欢迎所有帮助。

2 个答案:

答案 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函数。

您也可以使用enumeraterange,而不需要在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个列表,如果你的初始字符串/列表非常大,这可能是个问题。