2013-09-29 5 views
-1

Почему следующий код не работает?Python Поиск по спискам в списках

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

Очень жаль, что все путаницы, все. Я пытался проверить весь список и все его подсписки, и я не понял, что это будет проверять только второй элемент списка, поскольку я забыл, что Python имеет 0-ю позицию для первого элемента. Но как я могу проверить весь список? удалить «break» и [1]?

+2

* Что * Не работает? –

+1

В коде правильно указано «нет» - в списке нет подписок, второй элемент которого «4». – kindall

+1

.. Ваши 'print' тоже странные. Если вы используете Python 2, вам не нужны скобки.И если вы используете Python 3, 'print (« there »), sublist' фактически не будет печатать' sublist'. Вы на самом деле создаете кортеж длиной-2 (print («there»), sublist) '- где' print («there») 'возвращает' None', а затем отбрасывает его. Вероятно, вы имели в виду 'print (« there », sublist)'. – DSM

ответ

2

Это легко сделать с помощью generator expressions и встроенную функцию any:

data = [["4","5"],["3","7"]] 
search = "4" 

if any(element == search for sublist in data for element in sublist): 
    print ("there") 
else: 
    print("not there") 

Или еще короче, как указано на @Veedrac в комментариях:

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

EDIT: Если вы хотите напечатать подсписку, где элемент был найден, необходимо использовать явный цикл, как показано в ответе @ thefourtheye:

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

'any (поиск в подписок для подсписок в данных)' – Veedrac

+0

технически, это выражение генератора, а не понимание списка :) –

+0

+1 если вы включили предложение Veedracs. – Noctua

2

Списки индексируются 0 в Python, поэтому ["4", "5"][1] является "5", а не "4".

Кроме того, вы хотите проверить, был ли "4" в под-списке или в под-списке в первой позиции? Если это первый, вы можете вместо этого использовать if search in sublist.

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

+0

Кроме того, перерыв должен быть удален из другого, если он хочет проверить полный список. – Noctua

+0

@Noctua Да, непонятно, что именно пытается сделать OP здесь, надеюсь, он уточнит:) –

+0

Код был бы совершенно бессмысленным, если бы он не хотел проверять каждый подсписчик, поэтому ...: P – Noctua

0

Что сказал Томас, + вы нарушаете в любом случае, поэтому после первого элемента в главном списке вы просто выходите из цикла for и не проверяете какие-либо дополнительные элементы. Что вам нужно:

data = [["4","5"],["3","7"]] 
search = "4" 
for sublist in data: 
    if sublist[0] == "4": 
     print "there", sublist 
     break 
else: 
    print "not there" # executed when the for-loop finishes without break 
0

Когда вы пишете

if sublist[1] == "4": 

вы проверяете, если элемент 2-й является "4".

Чтобы проверить это "4" вsublist, используйте

if "4" in sublist: 

Чтобы проверить, если "4" находится в положении 1, используйте

if sublist[0] == "4": 

Кроме того, вы break после каждого else, поэтому, если нет совпадения для первого list, вы делаете не проверять более поздние! Удалите это break!

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

wow, идентичный моему фрагменту - вы скопировали? –

+0

Я узнал еще часть от вашего кода. Но я ищу оператор 'in'. Надеюсь, вы не против. :) – thefourtheye

+0

@ErikAllik: это не идентично, проверьте 'print'. – DSM

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