Использование цикла для описания нескольких условий - PullRequest
0 голосов
/ 29 мая 2018

В следующем коде я пытаюсь извлечь числа из списка, в котором все цифры делятся на 2. Следующий код работает.

l = range(100,401)
n=[]
for i in l:
    s =str(i)
    if all([int(s[0])%2==0,int(s[1])%2==0,int(s[2])%2==0]):
          n.append(s)
    print(",".join(n))

Я пытался вставить цикл for, чтобы избежатьявная запись всех трех условий.

l = range(100,401)
n=[]
ss=[]
for i in l:
    s =str(i)
ss.append(s)
for element in ss:
    for j in range(3):
        if int(element[j])%2==0:
            n.append(element)

print(n)

Я не могу получить желаемый результат.Мало того, элементы списка вывода 'n' с четным индексом печатаются дважды.Я не могу понять, ПОЧЕМУ?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Вы можете сделать это:

l = range(100, 401)
n = []
for i in l:
    v = 0
    for j in str(i):
        if int(j) % 2 == 0:
            v += 1
    if v == len(str(i)):
        n.append(str(i))
print(",".join(n))

Или с некоторым пониманием списка:

l = range(100, 401)
n = []
for i in l:
    if all(int(j) % 2 == 0 for j in str(i)):
        n.append(str(i))
print(",".join(n))

Или с еще большим пониманием списка:

l = range(100, 401)
n = [str(i) for i in l if all(int(j) % 2 == 0 for j in str(i))]
print(",".join(n))

Или ссмешная минимизация:

print(",".join([str(i) for i in range(100, 401) if all(int(j) % 2 == 0 for j in str(i))]))

Объяснение

ОП попросил меня объяснить, почему его код не работает.Я сделаю это в несколько шагов, также оптимизируя это:

l = range(100,401)
n = []
ss = []
for i in l: # You don't need this loop, you are just making a new list with string values instead of integers. You could make that on the fly.
    s = str(i)
    ss.append(s)
for element in ss:
    for j in range(3):
        if int(element[j]) % 2 == 0: # This only check if the current digit is pair and it append the whole number to the list. You have to check if the 3 numbers are pair AND then append it. 
            n.append(element)
print(n)

Ваш код проверяет каждую цифру, и если это правда, число добавляется в список результатов (n).Но вы не хотите этого, вы хотите проверить, являются ли 3 цифры, которые составляют номер, парными, поэтому вы должны проверить всю группу.

Например, вы можете сделать это:

for element in l:
    pairs = 0
    for j in range(3):
        if int(str(element)[j]) % 2 == 0:
            pairs += 1 # Each time a digit of the number is pair, `pairs` variable increase in one
    if pairs == 3: # If the 3 digits are true it append your number
            n.append(str(element))

Это моя первая идея, как улучшить ваш код, но вместо element и pairs я использую j и v, (также я не использую range(3), я просто повторяючерез строковое число).

Если вы ищете что-то «лучшее», вы можете попробовать использовать понимание списка, например all(int(j) % 2 == 0 for j in str(i)).Это перебирает все цифры, чтобы проверить, являются ли они парой, если все проверки верны (например, 222 или 284), он возвращает true.

Дайте мне знать, если я должен объяснить что-то еще.

0 голосов
/ 29 мая 2018

Попробуйте этот метод.Вам не нужно проверять все номера.Вам просто нужно изменить оператор диапазона с range(100, 401) на range (100, 401, 2) и добавить некоторые проверки в качестве чисел, которые имеют первую цифру как нечетную, вы можете пропустить все 100 чисел, а затем в следующих 10 сериях вы можете пропустить 10, если десятая цифрастранноЭто уменьшает сложность и уменьшает ваше время обработки.

l = range(100, 401, 2)
n = []
for i in l:
    s = str(i)
    if int(s[0]) % 2 == 1:
        remainder = i % 100
        i = i - remainder + 100 - 1
        continue
    elif int(s[1])%2 == 1:
        remainder = i % 10
        i = i - remainder + 10 - 1
        continue
    n.append(s)
print(",".join(n))
0 голосов
/ 29 мая 2018

Проверка выражения генератора, если all() элементы оцениваются в True, приходит вам на помощь:

l = range(100,401)
n=[]
for i in l:
    s = str(i)
    if all(int(ch) % 2 == 0 for ch in s):
          n.append(s)
    print(",".join(n))

Теперь это также работает, даже если вы работаете с большим количеством цифр.

Спасибо заСовет @ jpp по выражению генератора!


А вот альтернатива более быстрая , где вы оцениваете, не является ли any() делимым на 2.

l = range(100,401)
n=[]
for i in l:
    s = str(i)
    if any(int(ch) % 2 != 0 for ch in s):
        continue
    else:
        n.append(s)
    print(",".join(n))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...