2013-08-12 2 views
1

У меня есть список T = [[2,5],[4,7],[8,6],[34,74],[32,35],[24,7],[12,5],[0,34]], и я хочу проверить, удовлетворяют ли все элементы в каждом внедренном списке внутри T неравенством.Python - проверить, удовлетворяют ли все элементы в списке неравенством

До сих пор у меня есть:

upper = 10 
lower = 0 
for n in range(len(T)): 
    if all(lower < x < upper for x in T): 
     'do something' 
    else: 
     'do something different' 

Так что, если все элементы в каждом Т [п] находятся в диапазоне от 0 до 10, я хочу сделать что-то, и если еще тогда я хочу сделать что-то другое. В списке выше T [0] T [1] и T [2] удовлетворяли бы неравенству, тогда как T [3] не будет.

+4

Что проблема с кодом? –

+0

Как насчет кода, который вы показали, не делает то, что вы хотите? Можете ли вы уточнить, что хотите? Не смущает ли дело с вложенными списками? Достаточно ли было бы сгладить 'T'? –

+0

@Rohit Jain Когда я запускал код, неравенство выполнялось каждый раз - поэтому функция all() вернулась к истине, даже когда неравенство явно не выполнялось. – Holtz

ответ

6

Вы почти находитесь. Просто замените range(len(T)) с T перебрать T список и проверьте наличие вложенных элементов, если условие, а именно:

>>> T = [[2,5],[4,7],[8,6],[34,74],[32,35],[24,7],[12,5],[0,34]] 
>>> upper = 10 
>>> lower = 0 
>>> for elem in T: 
     if all(lower < x < upper for x in elem): 
      print "True", elem 
     else: 
      print "False", elem 


True [2, 5] 
True [4, 7] 
True [8, 6] 
False [34, 74] 
False [32, 35] 
False [24, 7] 
False [12, 5] 
False [0, 34] 
0

вы также можете получить список индексов и проверил состояние со списком понимания:

>>> T = [[2,5],[4,7],[8,6],[34,74],[32,35],[24,7],[12,5],[0,34]] 
>>> upper = 10 
>>> lower = 0 
>>> result = [(i, all(lower < x < upper for x in l)) for i, l in enumerate(T)] 
[(0, True), (1, True), (2, True), (3, False), (4, False), (5, False), (6, False), (7, False)] 
1

Я хотел бы избежать сложный код и пойти на numpy:

a = np.array(T) 

test = (a>0) & (a<10) 
#array([[ True, True], 
#  [ True, True], 
#  [ True, True], 
#  [False, False], 
#  [False, False], 
#  [False, True], 
#  [False, True], 
#  [False, False]], dtype=bool) 

test.all(axis=1) 
#array([ True, True, True, False, False, False, False, False], dtype=bool) 

что вы можете повторное использование в качестве списка, вызывающего test.any(axis=1).tolist().

+1

Пока OP еще не использует numpy в своей программе, или список огромен, и скорость - проблема, это очень плохой совет. Установка внешней библиотеки для такой тривиальной задачи, как это, будет самым определением overkill, особенно если в библиотеке есть C-расширения, которые необходимо скомпилировать. Добавление зависимости должно быть продуманным шагом, а не тем, что вы делаете, потому что оно упрощает две строки кода. Конечно, это менее актуально для небольших личных сценариев, которые будут работать только в одной среде, но в противном случае зависимости должны быть как можно меньше. – l4mpi

1

Да, я бы также пойти на NumPy:

import numpy as np 

T = [[2,5],[4,7],[8,6],[34,74],[32,35],[24,7],[12,5],[0,34]] 
T = np.array(T) 
for t in T: 
    if np.all(t>0) & np.all(t<10): 
     print t 
    else: 
     print 'none' 

[2 5] 
[4 7] 
[8 6] 
none 
none 
none 
none 
none 
Смежные вопросы