On 08Jan2019 15:28, Dan Sommers <2qdxy4rzwzuui...@potatochowder.com> wrote:
>> >>> a = [1, 1, 1, 1, 1] >> >>> a[1:] == a[:-1] >> True >> >>> a == a[::-1] >> True >> >> >>> a = [1, 2, 3, 4, 3, 2, 1] >> >>> a[1:] == a[:-1] >> False >> >>> a == a[::-1] >> True >> >> Looks like Peter's pretty clever after all. :-) > > Except that his solution always scans then entire list. Twice. > > For large dissimilar lists this gets needlessly expensive in a linear fashion > with the length of the list. > > It is succinct, but wasteful. > I ran it with the timeit module for the specific case of a list: tlst = [True for _j in range(int(1e8))] # Very fast. # all_equal(tlst) times = [9.820610110182315e-07, 9.798338289838284e-07, 9.83037088997662e-07, # 9.824190249200911e-07] seconds. def all_equal(alist) -> bool: if len(alist) == 0 or all(i == a[0] for i in a[1:]): return True return False # The variant: if alist == alist[::-1]: # actually has a memory leak. And I eventually killed the process after waiting about # ten minutes, while watching the memory leak. # # This variant doesn't have a memory leak. I'm still waiting after 15 minutes. Might give up # on it. The other solution is the way to go. def all_equal_array_list(alist) -> bool: if alist == alist[:-1]: return True return False if __name__ == '__main__': tae = timeit.repeat(timeit_all_equal,repeat=4,number=1000000,globals=globals()) print(f"all_equal(tlst) times = {[_t/1e6 for _t in tae]} seconds.\n") taeal = timeit.repeat(timeit_all_equal_array_list,repeat=4,number=1000000,globals=globals()) print(f"all_equal_array_list(tlst) times = {[_t/1e6 for _t in taeal]} seconds.\n") -- https://mail.python.org/mailman/listinfo/python-list