繁体   English   中英

如何检查字典中的列表值是否相等?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM