如何检查字典中的键是否以另一个字典中的键开头?

4 投票
2 回答
5501 浏览
提问于 2025-04-18 01:31

这里有一个简单的例子,说明我想做的事情。我有两个字典:

dictA = {"apple": 1, "orange": 2, "chocolate": 3, "mango": 4}
dictB = {"man": "abc", "or": "asdf", "app": "fasdfkl"}

我想让它打印出来(这三个键和值的实际顺序并不重要):

I can find...
orange2
mango4
apple1

I cannot find...
chocolate3

我尝试做过类似的事情,但在第二部分遇到了困难。

print "I can find ..."
for itemA in dictA:
    for itemB in dictB:
        if itemA.startswith(itemB):
            print itemA + str(dictA[itemA])

它会打印出

I can find ...
orange2
mango4
apple1

2 个回答

0

我建议你记录下你找到的键,并在最后输出那些没有找到的键:

dictA = {"apple": 1, "orange": 2, "chocolate": 3, "mango": 4}
dictB = {"man": "abc", "or": "asdf", "app": "fasdfkl"}
found_keys = set()

for key_b in dictB.keys():
  for key_a in dictA.keys():
    if key_a.startswith(key_b):
      print "I can find: %s %s" % (key_a, dictA[key_a])
      found_keys.add(key_a)
      break
print "I couldn't find: %s" % dict((k, dictA[k]) for k in set(dictA.keys()) - found_keys)

这样会输出:

I can find: apple 1
I can find: orange 2
I can find: mango 4
I couldn't find: {'chocolate': 3}

编辑: 我刚看到 gnibbler回答。我觉得这个回答比我的好,虽然我的方法没有使用 any,而是明确调用了 keys() 方法,这样可能更容易理解(不过,如果你明白了gnibbler的回答,那就用他的吧)

5

首先,把第一个循环简化成这样

print "I can find ..."
for itemA in dictA:
    if any(itemA.startswith(itemB) for itemB in dictB):
        print itemA + str(dictA[itemA])

第二个循环可以用 if not any(...) 来实现

这个算法效率不是很高,但我想你只是做个练习而已

撰写回答