оператор if против каждого элемента в списке - PullRequest
0 голосов
/ 22 декабря 2011

Я пытаюсь сделать что-то вроде следующего в Python, но я получаю неверную синтаксическую ошибку:

network_n = 192.168.38
octate_n = network_n.split(".")
if (len(o) [for o in octate_n]) == 3:

Но когда я запускаю его, я получаю:

if (len(o) [for o in octate_n]) == 3:
                  ^
SyntaxError: invalid syntax

Моя проблема с оператором if, что там не так?

Я признаю, что у меня есть приблизительное представление о разнице между () и [] в операторе if, поэтому я был бы рад, если бы вы дали мне краткое объяснение этого вопроса.

Ответы [ 4 ]

6 голосов
/ 22 декабря 2011

Использование all:

if(all(len(o) == 3 for o in octate_n)):
    # do stuff

Что касается вашего секундного вопроса, [o for o in octate_n] создает список, который состоит из всех элементов в octate_n (это называется понимание списка ), тогда как (o for o in octate_n) создает генератор это даст все элементы octate_n (это называется выражение генератора ).

2 голосов
/ 22 декабря 2011

Хорошо, я могу сказать вам, что не так с синтаксисом вашего условного выражения: по крайней мере, вам нужно включить len(o) в скобки.

[len(o) for o in octate_n]

Эта структура, [expr for var in list], называется пониманием списка, и это сокращение для "оценки expr для каждого элемента list, с var, установленным для элемента, и создания нового списка результатов. «. В исходном коде у вас не было expr, поэтому Python жаловался.

Теперь, даже если вы исправите это, вы получите

if [len(o) for o in octate_n] == 3:

, которая все еще имеет проблему с тем, что вы сравниваете список с числом. Хотя технически вы можете это сделать, это, вероятно, не означает, что вы ожидаете: список никогда не будет равен числу, потому что это разные объекты. Хотя не совсем понятно, что ты пытался сделать. Если вы хотите узнать, имеют ли все элементы списка длину 3, вы должны написать

if all([len(o) == 3 for o in octate_n]):

или, более эффективно,

if all(len(o) == 3 for o in octate_n):

Обратите внимание на отсутствие квадратных скобок в последующем утверждении. Это потому, что вам на самом деле не нужно составлять список из результатов; вам просто нужно иметь возможность просматривать их по одному и проверять, все ли они правдивы. Пропуск скобок - вот что указывает на это в Python. (Вы можете сделать это только в скобках.)

0 голосов
/ 22 декабря 2011

Я не совсем уверен, какой у вас вопрос.Вот несколько возможностей:

Если вы хотите вернуть все элементы octate_n, имеющие длину 3:

with_len_3 = [o for o in octate_n if len(o) == 3]

Если вы хотите убедиться, что в octate_n есть 3 элемента:

if len([o for o in octate_n]) == 3:
    # do stuff

, что соответствует

if len(octate_n) == 3:
    # do stuff

Если вы хотите убедиться, что все элементы в octate_n имеют длину 3:

if( all(len(o) == 3 for o in octate_n) ):
    # do stuff

, это более чистая и быстрая версия:

if len([o for o in octate_n if len(o) == 3]) == len(octate_n):
    # do stuff
0 голосов
/ 22 декабря 2011

Вы используете len для одного элемента списка.Эмм .. нет .. вы используете len (o) для элемента, который не определен.Использование:

if (len(octate_n) == 3:

Извините, понял вашу идею.Если вы хотите проверить, что все элементы списка имеют длину 3 символа - используйте «все», как указано ниже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...