Python - итерация по вложенному циклу - PullRequest
0 голосов
/ 18 февраля 2019

Во-первых, я уверен, что такая базовая вещь была задана ранее, но я не смог найти пост об этом.

У меня есть пример данных:

'192.168.244.213': ['8', '4', '3', '1', '6', '5', '3', '2', '6', '5'], 
'192.168.244.214': ['6', '8', '7', '6', '5', '4', '2', '7', '5', '5'], 
'192.168.244.215': ['4', '10', '0', '8', '7', '0', '4', '3', '2', '6'], 
'192.168.244.230': ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0']

И я хочу напечатать каждую строку (каждая строка - одна пара ключ-значение словаря), у которой есть значение списка, список которого содержит любое количество элементов, отличное от 0 (в данном случае, каждая строка, кроме 4-й)

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

for i in d.keys():
    if "0" not in d[i]:
        print(i, d[i])

Этот показывает только списки, которые не содержат 0 ВСЕ - так что третьестрока не будет показана, даже если она содержит ненулевые значения

for i in d.keys():
    for j in d[i]:
        if j is not "0":
            print(i, d[i])

Эта строка показывает мне, что я хочу, но, как вы можете сказать, она выводит каждый результат слишком часто - по одной печати для каждогозначение списка, которое не равно 0.

Ответы [ 7 ]

0 голосов
/ 18 февраля 2019

Мне нравятся другие ответы, но я чувствую, что вам тоже может это сойти с рук:

for i in d.keys():
    #If there are as many zeroes as there are elements in the list...
    if d[i].count(0) == len(d[i]):
        #...You might as well skip it :)
        continue
    print(d[i])
0 голосов
/ 18 февраля 2019

Посмотрите, как я могу это сделать.

d = {
    '192.168.244.213': ['8', '4', '3', '1', '6', '5', '3', '2', '6', '5'], 
    '192.168.244.214': ['6', '8', '7', '6', '5', '4', '2', '7', '5', '5'], 
    '192.168.244.215': ['4', '10', '0', '8', '7', '0', '4', '3', '2', '6'], 
    '192.168.244.230': ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0']
}

for key in d.keys():
    if all( item == '0' for item in d[key]):
        pass
    else:
        print(key, d[key])
0 голосов
/ 18 февраля 2019

Ваша ошибка в основном просто отсутствующий разрыв:

for i in d.keys():
    for j in d[i]:
        if j != "0":
            print(i, d[i])
            break

Однако для краткости я бы порекомендовал вам проверить функцию any(), которая делает именно то, что вы хотите: Верните true, если любой изэлементами итерируемого являются true (при приведении к логическому значению).

Например:

for i in d.keys():
    if any(j != "0" for j in d[i]):
        print(i, d[i])

(Генератор j is not "0" необходим только потому, что у вас есть строковые значения. Для типа intмассив, any(d[i]) будет работать.)

Еще больше "Pythonic" устраняет необходимость поиска в словаре:

for i, d_i in d.items():
    if any(j != "0" for j in d_i):
        print(i, d_i)
0 голосов
/ 18 февраля 2019
for i in d.keys():
    all_zero = True
    for j in d[i]:
        if j is not "0":
            all_zero = False
            break
    if not all_zero:
        print(i, d[i])

Это может работать практически на любом языке:)

0 голосов
/ 18 февраля 2019

Вы можете просто перебирать, как

def all_zero(arr):
    for i in arr:
        if i != 0:
            return False
    else:
        return True

Вы можете вызывать его во всех списках один за другим.

0 голосов
/ 18 февраля 2019

Вы должны использовать all в этом случае, рассмотрите следующий пример:

digits = ['0', '2', '0', '4', '7', '5', '0', '3', '2', '6']
zeros = ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0']
print(all([k=='0' for k in digits])) #gives False
print(all([k=='0' for k in zeros])) #gives True

Пожалуйста, не забудьте поставить [k=='0' for k in ...] до all, так как список доставки напрямую даст True для обоих digits и zeros, так как оба содержат хотя бы один непустой str (str длиной 1 или более).

0 голосов
/ 18 февраля 2019

Использовать словарь-понимание:

d = {'192.168.244.213': ['8', '4', '3', '1', '6', '5', '3', '2', '6', '5'],
     '192.168.244.214': ['6', '8', '7', '6', '5', '4', '2', '7', '5', '5'],
     '192.168.244.215': ['4', '10', '0', '8', '7', '0', '4', '3', '2', '6'],
     '192.168.244.230': ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0']}

result = {k: v for k, v in d.items() if not all(x == '0' for x in v)}

# {'192.168.244.213': ['8', '4', '3', '1', '6', '5', '3', '2', '6', '5'],
#  '192.168.244.214': ['6', '8', '7', '6', '5', '4', '2', '7', '5', '5'],
#  '192.168.244.215': ['4', '10', '0', '8', '7', '0', '4', '3', '2', '6']}

Приведенный выше код генерирует новый словарь, в котором пропускаются все элементы, в которых значения - все нули.

Теперь, когда у вас есть словарь, вы можетелегко сделать итерацию примерно так:

for k, v in result.items():
    print(k, v)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...