【问题标题】:how to check if two numbers in a list are the same in Python如何检查列表中的两个数字在Python中是否相同
【发布时间】:2015-04-22 20:20:43
【问题描述】:

我在一些编码方面有一点问题。 这是我的代码:

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 循环。

非常欢迎所有帮助。

【问题讨论】:

    标签: python string python-2.7 while-loop int


    【解决方案1】:

    您可以使用一个集合来删除任何重复项并检查原始列表之后的长度:

    if len(set(modulo)) == len(modulo): # if lengths are  equal we have no duplicate nums
         print "valid"
    else:
          print "Invalid"
    

    如果您只是想避免添加 dups,请保留一组所有可见的数字并在添加前检查:

    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
    

    【讨论】:

    • 非常感谢!我一直在考虑如何解决它两个多小时,你在问的前两分钟内就给出了一个聪明的解决方案。我无法表达我的感激之情。祝你有美好的一天:)
    【解决方案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 个列表,如果您的初始字符串/列表非常大,这可能会成为问题。

    【讨论】:

    • 这不是一个真正有效的解决方案,因为您使用列表,因此查找是 0(n),而不是我建议的 set 0(1),最坏的情况是您仍然创建第二个列表 @ 987654326@ 然后您将其丢弃而没有快速查找的好处
    • 我同意,我更多地考虑内存使用而不是原始速度。我把它改成了一套,所以现在它的内存效率更高,速度更快:)
    • 是的,输入越多,集合就越重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    相关资源
    最近更新 更多