[英]How to check if list values inside a dictionary are equal?
我有一本字典,它经常循环检查。 循环应该确定字典中的列表是否都相等。 我尝试使用此函数(如下) - 如果值都相等,将打印 1。
def equalDict(values):
sample = []
for i in values:
for j in i:
sample.append(str(j))
return (len(set(sample)))
values 参数包含 somedict.values() 并且字典包含这些键值对:
sample = {'w0':[0.2, 0.2, 0.30000000004],'w1': [0.2, 0.2, 0.30000000004],'w2': [0.2, 0.2, 0.30000000004], 'w3': [0.2, 0.2, 0.30000000004]}
虽然所有这些都相同,但该函数返回 2 而不是 1。我这样做正确吗?
有什么理由不能只使用==
吗?
>>> a = ["a", 2, 3]
>>> b = ["a", 2, 3]
>>> a == b
True
>>> b = [1,2]
>>> a == b
False
所以对于你的具体情况,
sample = {'w0':[0.2, 0.2, 0.30000000004],'w1': [0.2, 0.2, 0.30000000004],'w2': [0.2, 0.2, 0.30000000004], 'w3': [0.2, 0.2, 0.30000000004]}
keys = list(sample.keys())
value = True
for key in keys[1:]:
if sample[keys[0]]!=sample[key]:
value = False
break
print(value)
您的代码实际上并未检查所有列表是否相等。 它返回所有列表中唯一元素的总数。
以你的例子:
sample = {'w0':[0.2, 0.2, 0.30000000004],'w1': [0.2, 0.2, 0.30000000004],'w2': [0.2, 0.2, 0.30000000004], 'w3': [0.2, 0.2, 0.30000000004]}
equalDict(sample.values())
计算并返回len({0.2, 0.30000000004})
即2
。
要检查列表的元素是否都相等,您可以执行以下操作:
all_equal = len(set(elements)) == 1
当且仅当元素中的每个elements
都是可散列/不可变的。 在这种情况下, elements
是一个列表列表——即每个元素都是一个列表——列表不是可散列/不可变的,所以你会得到TypeError: unhashable type: 'list'
如果你绑定:
elements = [[0.2, 0.2, 0.30000000004], [0.2, 0.2, 0.30000000004], [0.2, 0.2, 0.30000000004]]
all_equal = len(set(elements)) == 1 # TypeError: unhashable type: 'list'
一种解决方法是将每个元素/列表变成一个元组(元组是可散列/不可变的):
元素都相等的情况:
elements = [[0.2, 0.2, 0.30000000004], [0.2, 0.2, 0.30000000004], [0.2, 0.2, 0.30000000004]]
elements = map(tuple, elements)
all_equal = len(set(elements)) == 1
print(all_equal) # True
元素不完全相等的情况
elements = [[0.1, 0.2, 0.30000000004], [0.2, 0.2, 0.30000000004], [0.2, 0.2, 0.30000000004]]
elements = map(tuple, elements)
all_equal = len(set(elements)) == 1
print(all_equal) # False
这仅在elements
中的每个elements
都是可散列/不可变值列表时才有效,因此以下将导致错误:
elements = [[0.1, 0.2, [1, 2]], [0.2, 0.2, [1, 2]], [0.2, 0.2, [1, 2]]]
elements = map(tuple, elements)
all_equal = len(set(elements)) == 1
print(all_equal) # TypeError: unhashable type: 'list'
但这似乎不是您的用例。
总之:
def all_equal(elements):
elements = map(tuple, elements)
return len(set(elements)) == 1
将适用于您的用例,其中elements
是可散列/不可变值列表的列表,例如[[0.2, 0.2, 0.30000000004], [0.2, 0.2, 0.30000000004], [0.2, 0.2, 0.30000000004]]
.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.