在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等的目的。>
答案 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]
。