如何将Python3范围与列表进行比较

时间:2019-04-08 02:12:50

标签: python python-3.x

在Python2中,当您调用range时,会得到一个列表。在Python3中,当您调用range时,您将获得一个范围并避免立即实例化所有元素。

我想将范围x与列表y比较,以检查两个元素序列是否相同。我可以做list(x) == y,但是那不通过实例化所有元素来破坏Python3范围应该给我的效率,因此与Python2相比,我有更多冗长的代码,没有任何好处。我可以使用all(map(lambda p: p[0] == p[1], zip(x, y))),它使用恒定的(附加)空间,但是感觉就像写一份法律文件只是为了买杯咖啡。

all(...)相比,有没有一种方法会占用恒定的空间,但使用的冗长代码和可读性更高?一般来说,我经常发现自己将Python3非列表对象(例如range和map)转换为列表,以便我可以使用简单,易读的代码来处理它们,这似乎违反了Python3范围,map等的目的。

2 个答案:

答案 0 :(得分:0)

您可以使用zip并按元素进行比较。

def compare_sequences(seq1, seq2):
    if len(seq1) != len(seq2):
        return False

    for a, b in zip(seq1, seq2):
        if a != b:
            return False
    else:
        return True

但是您实际上不应该这样做。性能提升很小,并且您的代码可读性较低。

请记住,过早的优化是万恶之源。

答案 1 :(得分:0)

This是对Python 3's range函数(其本质上是Python 2's xrange)及其优点的很好描述。除了list,您还可以将 new range函数转换为其他类型,例如set进行比较。例如:

x = range(4)
L1 = [0,1,2,3]
S1 = {0,1,2,3}

print(L1 == list(x))  ## True
print(S1 == set(x))  ## True  

请注意,all(map(lambda p: p[0] == p[1], zip(x, y)))是不正确的比较if x = [1,2,3] and y=[1,2,3,4]