2013-10-02 4 views
-2

Мне нужен Python для поиска всех подсписок заданного списка, но это не работает, когда я ищу элемент, содержащийся только в одном из них. Например, это мой код:Поиск нескольких подвыписей одного и того же списка в Python

data = [[4,5],[4,7]] 
search = 4 
for sublist in data: 
    if search in sublist: 
     print("there", sublist) 

    else: 
     print("not there") 
     print(data) 

и это работает очень хорошо, если мой поиск содержатся во всех подсписках перечней. Однако, если мой поиск, например, 5, то я получаю:

there [4,5] #I only want this part. 
not there # I don't want the rest. 
[[4, 5], [4, 7]] 

EDIT: В принципе, мне нужно Python перечислить все списки поиска содержится, но если поиск содержится только в один подсписок, я хочу только print("there", sublist). Другими словами, я хочу, чтобы Python распознавал места поиска, а не выводил их там, поэтому нет print("not there") print(data).

+1

Вам нужно уточнить, каков ваш ожидаемый результат. Что, если он находится в двух из трех подписок? Вы ожидаете, что ваш поиск остановится на первом, или ...? – roippi

+0

Я согласен с roippi, ваш вопрос действительно запутан. Кажется, что это просто прорыв после 'print (« there », sublist)', это то, что вы ищете, но я не уверен, потому что я не знаю, чего вы действительно хотите. – btse

+0

Мне совершенно ясно, какой ответ должен быть именно тем, что ответил @tcaswell. – justhalf

ответ

2

Попробуйте использовать булев тег. Например:

data = [[4,5],[4,7]] 
search = 5 
found = false 
for sublist in data: 
    if search in sublist: 
     print("there", sublist) 
     found = true 
if found == false: 
    print("not there") 
    print(data) 

Таким образом, данные печати вне для цикла и не будет печататься каждый раз, когда Подсписок установлено, что не содержит поиска.

1
data = [[4,5],[4,7]] 
search = 4 
found_flag = False 
for sublist in data: 
    if search in sublist: 
     print("there", sublist) 
     found_flag = True 

#  else: 
#  print("not there") 
#  print(data) 
if not found_flag: 
    print('not found') 

Там нет оснований включать пункт else, если вы не хотите ничего делать с суб-списков, которые не включают в себя стоимость поиска.

Изящное использование else является после for блока (но это будет только найти одну записи) (doc):

data = [[4,5],[4,7]] 
search = 4 
for sublist in data: 
    if search in sublist: 
     print("there", sublist) 
     break 
else: 
    print 'not there' 

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

+0

Это должно быть то, что хочет OP. – justhalf

+0

Мне очень нравится этот ответ; однако, можно ли его расширить, чтобы, если поиск включен в несколько подписок, все они печатаются вместо первого, хронологически? – 5813

+0

см. Ответ @ user2255137 о том, как добавить флаг в этот цикл. – tacaswell

0

Вы могли бы искать

for sublist in data: 
    if search in sublist: 
     print("there", sublist) 
     break 
    else: 
     print("not there") 

print(data) 
1

То, что вы, вероятно, пытается написать:

data = [[4,5],[4,7]] 
search = 4 
found = False 
for sublist in data: 
    if search in sublist: 
     found = True 
     break 
# do something based on found 

лучший способ, чтобы написать, что:

any(search in sublist for sublist in data) 
0

данных = [[4,5], [4 , 7], [5,6], [4,5]]

поиск = 5

для подсписка в данных:

if search in sublist: 

    print "there in ",sublist 

else: 
    print "not there in " , sublist 

там в [4, 5]

не существует в [4, 7]

там в [5, 6 ]

в [4, 5]

Я только что попробовал ваш код, и я не вижу ничего плохого при поиске 5

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