有点奇怪的问题,但是。我需要一个字符串列表,我需要确保该列表中的每个字符串都是相同的。
E.g:
a = ['foo', 'foo', 'boo'] #not valid
b = ['foo', 'foo', 'foo'] #valid
最好的办法是什么?
仅供参考,我不知道列表中会有多少字符串。这也是一个非常简单的问题,但我太累了,无法直接思考。
答案 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,它都会失败。