Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中检查列表中的两个数字是否相同_Python_String_Python 2.7_While Loop_Int - Fatal编程技术网

如何在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作为变量名,因为它会隐藏内置的python
sum
函数

您还可以使用
枚举
范围
,不需要在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'