Сравнивать список аргументов с самим собой? - PullRequest
2 голосов
/ 11 декабря 2008

Вроде странный вопрос, но. Мне нужно иметь список строк, которые мне нужны, чтобы убедиться, что каждая строка в этом списке одинакова.

например:

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

Какой лучший способ сделать это?

К вашему сведению, я не знаю, сколько строк будет в списке. Кроме того, это очень простой вопрос, но я слишком устал, чтобы думать прямо.

Ответы [ 7 ]

5 голосов
/ 11 декабря 2008

Возможно

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

- самый читаемый способ.

5 голосов
/ 11 декабря 2008

Используйте list.count, чтобы получить количество элементов в списке, которые соответствуют значению. Если это число не соответствует количеству предметов, вы знаете, что они не совпадают.

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

Что бы выглядело как ...

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

... в производственном коде.

3 голосов
/ 11 декабря 2008

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
2 голосов
/ 11 декабря 2008

Попробуйте создать набор из этого списка:

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

Наборы не могут иметь повторяющиеся элементы.

РЕДАКТИРОВАТЬ: предложение С. Лотта чище:

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

Думайте об этом так:

# Equality returns True or False
all_items_are_same = (len(set(my_list)) == 1)
1 голос
/ 11 декабря 2008

Независимо от того, какую функцию вы используете, вы должны выполнить итерацию по всему массиву хотя бы один раз.

Так что просто используйте цикл for и сравните первое значение с каждым последующим значением. Ничто не может быть быстрее, и это будет три строки. Все, что делает это в меньшем количестве строк, вероятно, будет на самом деле более сложным в вычислительном отношении.

0 голосов
/ 11 декабря 2008

Я думаю, что это должно быть чем-то, что вы делаете с помощью функции приведения ...

>>> 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.

0 голосов
/ 11 декабря 2008

try (если списки не слишком длинные):

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

это позволяет сравнивать список со списком того же размера, который является одним и тем же первым элементом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...