有没有简单的方法来比较python中的列表项?

时间:2013-11-29 10:59:03

标签: python python-2.7

让我说我有:

x= [2,2,2,2]
y= [2,1,2,2]

是否有任何简洁的方法来检查列表项是否全部相等。所以,我想把输出放在:

x True
y False 

4 个答案:

答案 0 :(得分:5)

如果您关心性能并且列表可能很长:

all(item == x[0] for item in x)

一旦找到不相等的元素,就会完成。请注意,all会为空序列返回True,因此,如果这不是您想要的结果,请先测试len(x)

蒂姆斯,对于故意操纵的案件赞成我的回答:

$ python --version
Python 2.7.5

$ python -mtimeit "x = range(1000000)"
10 loops, best of 3: 18 msec per loop

$ python -mtimeit "x = range(1000000); all(item == x[0] for item in x)"
100 loops, best of 3: 19.2 msec per loop

$ python -mtimeit "x = range(1000000); all(item == x[0] for item in x[1:])"
10 loops, best of 3: 35.6 msec per loop

$ python -mtimeit "x = range(1000000); len(set(x)) == 1"
10 loops, best of 3: 72.7 msec per loop

通过“一点点”关心,我只是意味着采取简单的步骤来避免可能的大量不必要的工作和内存使用。如果你关心性能的很多,因为这行代码非常关键,那么你可以采取一些措施来调整我的答案。首先想到的是避免在元素0处进行自我比较,但我不知道itertools.islice是否具有足够低的开销以获得净胜利。你必须测试它。

答案 1 :(得分:5)

好吧,你可以使用set

>>> len(set(x)) == 1
True
>>> len(set(y)) == 1
False

使用以下脚本查看哪种方法最适合您:

from timeit import timeit

# All the same
print timeit('len(set([2, 2, 2, 2])) == 1')
# 0.843292317054

# Not the same
print timeit('len(set([2, 1, 2, 2])) == 1')
# 0.869108628247

## Without set ##

# AlL the same
print timeit('all(item == x[0] for item in x)', setup='x = [2,2,2,2]')
# 1.20339177387

# Not the same
print timeit('all(item == x[0] for item in x)', setup='x = [2, 1, 2, 2]')
# 1.42827283125

根据我的经验,使用set似乎是最快的方式。

答案 2 :(得分:4)

一种简单的方法是将列表转换为集合,并检查集合的长度:

def has_only_one_element(xs):
    return len(set(xs)) == 1

答案 3 :(得分:0)

我希望这个功能对你有用......

def chk_similar_ele(inp_list):
   return inp_list.count(inp_list[0]) == len(inp_list)