字典:检查键和值的每个元素是否相等
Dictionary: Check if each element of key & value is equal or not
所以我提取了一个 html 的来源并将所有内容转换成一个大词典。
这只是一个例子:
d = {fist:mist}
我的目标是通过索引比较字符:
(key[0] & value[0], key[1] & value[1], etc.)
并检查字符是否相等:
f != m, i == i, s==s, t==t
我能做的最好的:
d = {fist:mist}
difference = 0
no_difference = 0
for key, value in d.items():
for char1 in key:
pass
for char2 in value:
pass
if char1 != char2:
difference += 1
if char1 == char2:
no_difference +=1
print(difference)
print(no_difference)
感谢任何帮助。
编辑:非常感谢 Glenn Codes、Joe Iddon 和 Mike Müller!
假设键和值的长度相同,您可以这样做:
for key, value in d.items():
for i in range(len(key)):
if key[i] == value[i]:
no_difference +=1
else:
difference += 1
您需要遍历字典中的 key : value
对。对于每一对,您需要算出 key
和 value
之间有多少差异。这可以通过计算只包含不同字符的 list
的长度来完成。
然后我们只需将此长度添加到循环外的变量以跟踪总数。
d = {"fist":"mist"}
differences = 0
for k, v in d.items():
differences += len([i for i,c in enumerate(k) if c != v[i]])
print(differences)
对于这里的小例子,给出 1
因为 'f'
和 'm'
不同。
如果您还想计算匹配的字符数(即不不同),那么您可以执行相同的过程,但添加 key
的长度减去差异以获得数字相同的字符数:
d = {"fist":"mist"}
differences = 0
same = 0
for k, v in d.items():
differences += len([i for i,c in enumerate(k) if c != v[i]])
same += len(k) - differences
print(differences)
print(same)
再次给出 differences
作为 1
,但也给出 same
作为 3
(对于 'i'
、's'
和 't'
).
如果您只想要一个布尔值 (True / False
) 来判断 any 对之间是否有任何差异,您可以在一行中完成整个操作:
all(k == v for k,v in d.items())
在这种情况下给出 False
。
假设一个字典包含多个项目并且键和值的长度可能不同,这应该可行:
from itertools import zip_longest
d = {'fist': 'mist', 'fist1': 'mist22', 'x': 'many differences here'}
difference = 0
no_difference = 0
for k, v in d.items():
for item1, item2 in zip_longest(k, v, fillvalue=''):
if item1 == item2:
no_difference += 1
else:
difference += 1
print('difference:', difference)
print('no_difference:', no_difference)
输出:
difference: 25
no_difference: 6
所以我提取了一个 html 的来源并将所有内容转换成一个大词典。
这只是一个例子:
d = {fist:mist}
我的目标是通过索引比较字符:
(key[0] & value[0], key[1] & value[1], etc.)
并检查字符是否相等:
f != m, i == i, s==s, t==t
我能做的最好的:
d = {fist:mist}
difference = 0
no_difference = 0
for key, value in d.items():
for char1 in key:
pass
for char2 in value:
pass
if char1 != char2:
difference += 1
if char1 == char2:
no_difference +=1
print(difference)
print(no_difference)
感谢任何帮助。
编辑:非常感谢 Glenn Codes、Joe Iddon 和 Mike Müller!
假设键和值的长度相同,您可以这样做:
for key, value in d.items():
for i in range(len(key)):
if key[i] == value[i]:
no_difference +=1
else:
difference += 1
您需要遍历字典中的 key : value
对。对于每一对,您需要算出 key
和 value
之间有多少差异。这可以通过计算只包含不同字符的 list
的长度来完成。
然后我们只需将此长度添加到循环外的变量以跟踪总数。
d = {"fist":"mist"}
differences = 0
for k, v in d.items():
differences += len([i for i,c in enumerate(k) if c != v[i]])
print(differences)
对于这里的小例子,给出 1
因为 'f'
和 'm'
不同。
如果您还想计算匹配的字符数(即不不同),那么您可以执行相同的过程,但添加 key
的长度减去差异以获得数字相同的字符数:
d = {"fist":"mist"}
differences = 0
same = 0
for k, v in d.items():
differences += len([i for i,c in enumerate(k) if c != v[i]])
same += len(k) - differences
print(differences)
print(same)
再次给出 differences
作为 1
,但也给出 same
作为 3
(对于 'i'
、's'
和 't'
).
如果您只想要一个布尔值 (True / False
) 来判断 any 对之间是否有任何差异,您可以在一行中完成整个操作:
all(k == v for k,v in d.items())
在这种情况下给出 False
。
假设一个字典包含多个项目并且键和值的长度可能不同,这应该可行:
from itertools import zip_longest
d = {'fist': 'mist', 'fist1': 'mist22', 'x': 'many differences here'}
difference = 0
no_difference = 0
for k, v in d.items():
for item1, item2 in zip_longest(k, v, fillvalue=''):
if item1 == item2:
no_difference += 1
else:
difference += 1
print('difference:', difference)
print('no_difference:', no_difference)
输出:
difference: 25
no_difference: 6