【问题标题】:Dictionary: Check if each element of key & value is equal or not字典:检查键和值的每个元素是否相等
【发布时间】:2017-12-22 15:57:05
【问题描述】:

所以我提取了一个 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!

【问题讨论】:

  • 你希望你的输出是什么?总差多少?如果 一切 相同,则为真/假?或者别的什么...
  • 你想要的这个示例字典的输出是什么:d = {'fist': 'mist', 'fist1': 'mist22', 'x': 'many differences here'}?
  • @MikeMüller 不,我们的目标是评估每个键值对的差异。我会将每个 key:value 提取到一个新字典中并分别检查差异(我知道这似乎有点过于复杂)
  • 但是如果key和value的长度不同呢?例如。 {'long key with lots of characters': 'short value'}
  • @MikeMüller:格伦和乔回答了这个问题。我还没有达到那部分,但是当我达到时,我会写我所做的!

标签: python-3.x dictionary key-value


【解决方案1】:

您需要遍历字典中的 key : value 对。对于每一对,您需要计算出keyvalue 之间有多少差异。这可以通过计算仅包含不同字符的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) 值来判断 任何 对之间是否存在任何差异,您可以在一行中完成整个操作:

all(k == v for k,v in d.items())

在这种情况下给出False

【讨论】:

  • 感谢您的宝贵时间!
  • @Miggl 请接受答案以表示感谢(灰色 --> 答案旁边的绿色勾号)。
  • d = {"fist27":"mist"} 给了我一个IndexError
【解决方案2】:

假设键和值的长度相同:

for key, value in d.items():
    for i in range(len(key)):
        if key[i] == value[i]:
           no_difference +=1
        else:
           difference += 1

【讨论】:

  • 您实际上不需要同时跟踪no_differencedifference,因为您可以使用键/值的长度从另一个计算一个,但这个解决方案最接近您的已经有了。
  • 键和值的长度并不总是相同的,但这很有帮助,谢谢!
  • 啊,然后您可以简单地使用最短的键或值的长度作为范围。一个好的方法是简单地跟踪匹配的事件。 (在这种情况下为no_differencedifference 将自动成为最长的长度,同样是键或值,减去no_difference 的值。在fistmisty 的情况下,no_difference 将变为 3,difference 将变为 2,因为我们从 misty 的长度中减去 no_difference,即 5 - 3 = 2。
【解决方案3】:

假设一个字典包含多个项目和可能不同长度的键和值,这应该可以工作:

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

【讨论】:

  • 再次感谢您的评论!我已经尝试将您的解决方案实现到函数和外部。从外部看,它似乎有效,但它打印出太多差异。在函数中,它返回 None。正因为如此,我头疼得厉害,要休息一下,明天再试。感谢您的宝贵时间!
猜你喜欢
  • 2014-08-07
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
相关资源
最近更新 更多