Python-遍历嵌套循环

时间:2019-02-18 15:22:58

标签: python list dictionary for-loop

首先,我确定之前已经问过这样一个基本的问题,但是我找不到关于它的帖子。

我有以下示例数据:

'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的任意数量的项目(在这种情况下,除第四行外的每一行)

我似乎无法弄清楚这看似简单的事情-我之前尝试过的是这两件事:

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

该列表仅显示不包含0的列表-即使包含非0值,也不会显示第三行

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

这确实告诉我我想要什么,但是正如您所知道的,它以过于频繁的方式打印每个结果-对于每个不为0的列表值打印一次。

7 个答案:

答案 0 :(得分:2)

使用字典理解:

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)

答案 1 :(得分:2)

您可以像这样简单地进行迭代

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

您可以在所有列表上一一调用它。

答案 2 :(得分:1)

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])

这可能适用于几乎所有语言:)

答案 3 :(得分:1)

您的错误基本上只是一个缺失:

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

但是,为简洁起见,我建议您检查一下any()函数,该函数确实可以实现您想要的功能:如果iterable的任何元素为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)

答案 4 :(得分:1)

我喜欢其他答案,但我觉得您也可以摆脱类似的困扰:

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])

答案 5 :(得分:1)

看看我如何做到这一点。

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])

答案 6 :(得分:0)

在这种情况下,您应该使用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,因为直接传递列表会同时为Truedigits给出zeros,因为两者都包含至少一个非空str(长度str或更长的1)。