2015-07-29 6 views
0

Я половину ожидаю быть «обманутым» на этом. Но не похоже на такое питоновское «мозговое упражнение» в SO или даже на других языках.проверьте, что список содержит только элементы из данного «допустимого» списка.

Скажем, у меня есть «допустимый» список [ 45, 6, 155, 44 ] и я представить список [ 6, 44, 19, 12 ]: Я просто хотел бы знать, эффективный, элегантный и в целом красивый алгоритм для получения результата:

LEGAL: [ 6, 44 ] 
ILLEGAL: [ 19, 12 ] 

PS я в настоящее время используя 2.7, но ответы 3.x также приветствуются!

+0

legal = [x для x в a_list, если x разрешено] - ilegal = [x для x в a_list, если x не разрешено] –

ответ

5
permissible = [45, 6, 155, 44] 

Чтобы сохранить повторяющиеся значения:

legal = [] 
illegal = [] 
for item in submission: 
    if item in permissible: 
     legal.append(item) 
    else: 
     illegal.append(item) 

Или, если вы работаете с уникальными, hashable ценности:

legal = set(submission) & set(permissible) 
illegal = set(submission) - set(permissible) 
+0

ах да, действительно ... если это набор (или может быть превращен в один) ... который в моем конкретном случае использования так. –

+0

Хороший вопрос о требованиях к хешированию и уникальности. – chepner

0

Это должно сработать для вас.

permissible = [ 45, 6, 155, 44 ] 
def get_legal(permissible, input): 
    legal = [x for x in input if x in permissible] 
    illegal = [x for x in input if x not in permissible] 
    return legal, illegal 
+0

сделать допустимым набор, и у вас будет решение 0 (n) –

+0

Это проверяет каждый элемент для членства в «допустимый» дважды, кстати. – TigerhawkT3

0

Сохранить ваши legal значения как set, то конвертировать любой список, который вы хотите проверить на набор, и убедиться, что он равен issubset из legal.

0

Я хотел бы предложить это решение

some_list = [1,2,3,4] 
permissible = [1,2] 

legal = [x for x in some_list if x in permissible] 
ilegal = [x for x in some_list if x not in permissible] 

Надежда это помогает!

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