比较自己的参数列表?

时间:2008-12-11 16:14:25

标签: python

有点奇怪的问题,但是。我需要一个字符串列表,我需要确保该列表中的每个字符串都是相同的。

E.g:

a = ['foo', 'foo', 'boo'] #not valid
b = ['foo', 'foo', 'foo'] #valid

最好的办法是什么?

仅供参考,我不知道列表中会有多少字符串。这也是一个非常简单的问题,但我太累了,无法直接思考。

7 个答案:

答案 0 :(得分:5)

使用list.count获取列表中与值匹配的项目数。如果该数字与项目数量不匹配,您知道它们不完全相同。

if a.count( "foo" ) != len(a)

看起来像......

if a.count( a[0] ) != len(a)

...在生产代码中。

答案 1 :(得分:5)

也许

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

是最易读的方式。

答案 2 :(得分:3)

FYI。在输入列表的不同大小上对测试的匹配和不匹配版本进行5000次迭代。

List Size 10
0.00530 aList.count(aList[0] ) == len(aList)
0.00699 for with return False if no match found.
0.00892 aList == [aList[0]] * len(aList)
0.00974 len(set(aList)) == 1
0.02334 all(aList[0] == x for x in aList)
0.02693 reduce(lambda x,y:x==y and x,aList)

List Size 100
0.01547 aList.count(aList[0] ) == len(aList)
0.01623 aList == [aList[0]] * len(aList)
0.03525 for with return False if no match found.
0.05122 len(set(aList)) == 1
0.08079 all(aList[0] == x for x in aList)
0.22797 reduce(lambda x,y:x==y and x,aList)

List Size 1000
0.09198 aList == [aList[0]] * len(aList)
0.11862 aList.count(aList[0] ) == len(aList)
0.31874 for with return False if no match found.
0.36145 len(set(aList)) == 1
0.65861 all(aList[0] == x for x in aList)
2.24386 reduce(lambda x,y:x==y and x,aList)

明确赢家和输家。统计规则。

这是快速运行的quickExit版本,但不是单行。

def quickExit( aList ):
    """for with return False if no match found."""
    value= aList[0]
    for x in aList:
        if x != value: return False
    return True

答案 3 :(得分:2)

尝试从该列表中创建一个集合:

if len(set(my_list)) != 1:
    return False

集合不能包含重复项目。

编辑:S.Lott的建议更清晰:

all_items_are_same = len(set(my_list)) == 1

这样想:

# Equality returns True or False
all_items_are_same = (len(set(my_list)) == 1)

答案 4 :(得分:1)

无论您使用什么功能,都必须至少迭代整个阵列一次。

所以只需使用for循环并将第一个值与每个后续值进行比较。没有其他东西可以更快,它将是三条线。在较少的行中执行它的任何东西实际上可能在计算上更复杂。

答案 5 :(得分:0)

尝试(如果列表不太长):

b == [b[0]] * len(b) #valid
a == [a[0]] * len(a) #not valid

这使您可以将列表与相同大小的列表进行比较,该列表具有相同的第一个元素

答案 6 :(得分:0)

我认为这应该是你用reduce函数做的事情......

>>> a = ['foo', 'foo', 'boo'] #not valid
>>> b = ['foo', 'foo', 'foo'] #valid
>>> reduce(lambda x,y:x==y and x,a)
False
>>> reduce(lambda x,y:x==y and x,b)
'foo'
但是,我不确定这是否比将它变成一套解决方案更有优势。如果要测试数组中的每个值是否为False,它都会失败。