首先,我确定之前已经问过这样一个基本的问题,但是我找不到关于它的帖子。
我有以下示例数据:
'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的列表值打印一次。
答案 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
,因为直接传递列表会同时为True
和digits
给出zeros
,因为两者都包含至少一个非空str
(长度str
或更长的1
)。