2015-01-14 2 views
0

Учитывая список:Смотрите, если список имеет только определенные значения

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

Есть один лайнер, чтобы увидеть, если список только содержит заданные значения и ничего? Например:

x([1,2]) = True 
x([1,]) = False 
x([1,2,3]) = False 
+1

Почему 'True' для' [1, 2, 3] '? –

+0

@AshwiniChaudhary - потому что все элементы в '[1,2,1,1,1,2,1]' можно найти в '[1, 2, 3]'. – iCodez

ответ

3

Вы можете проверить, если, например, set(x) <= set([1, 2]). (Вы можете использовать {1, 2} для set([1, 2]) в Python 2.7 и выше.)

+0

'set ([1, 2, 3]). Issuperset (x)' должно быть предпочтительным. –

+0

Но тогда 'set ([1]) <= set ([1, 2])' if 'x = set ([1])' – jamylak

2

Похоже, вы хотите посмотреть, есть ли элементы списка из какого-либо набора. Если это так, вы можете преобразовать в набор и использовать issubset:

>>> x = set([1,2,1,1,1,2,1]) 
>>> x.issubset([1,2]) 
True 
>>> x.issubset([1]) 
False 
>>> x.issubset([1,2,3]) 
True 
5

Альтернативой set предложил в других вопросах, которые могут быть быстрее в некоторых случаях, в которых он терпит неудачу:

all(y in (1, 2) for y in x) 

Иногда это может быть быстрее, потому что all «не работает быстро» - он освобождается (не прерывает цикл), как только обнаруживается один элемент, который является ложным.

Что касается скорости,

$ python -mtimeit -s'x=[1,2,1,1,1,2,1];check=(1,2)' 'all(y in check for y in x)' 
1000000 loops, best of 3: 1.03 usec per loop 
$ python -mtimeit -s'x=[1,2,1,1,1,2,1];check=set((1,2))' 'all(y in check for y in x)' 
1000000 loops, best of 3: 1.01 usec per loop 

(временная разница "в шуме"). Предлагаемое использование сетов других ответов, если убийца ошибка присутствует в оригинальной версии и фиксируются, на самом деле быстрее:

$ python -mtimeit -s'x=[1,2,1,1,1,2,1];check=set((1,2))' 'set(x)<=check' 
1000000 loops, best of 3: 0.425 usec per loop 

Убийца ошибка в том, что сказала оригинальные версии, для обоего ответов (в настоящее время корректируются в редактировании), использовали == вместо <= - поэтому они проверили, что элементы x точно такие же, как и у check, а не по мере необходимости, чтобы удовлетворить ваши спецификации, являющиеся подмножеством (один из ваших примеров требуется True для x и [1,2,3], и обе эти оригинальные версии потерпели бы неудачу).

Смежные вопросы