检查dict值是否作为另一个dict中的键存在

时间:2018-02-14 11:02:42

标签: python dictionary key-value

我有两本词典:

concave = {6: [2, 3, 4, 5], 2: [6], 3: [6], 4: [6], 5: [6]}
convex = {1: [2, 3, 4, 5], 2: [1, 3, 5], 3: [1, 2, 4], 4: [1, 3, 5], 5: [1, 2, 4], 6: [7, 8, 9, 10], 7: [6, 8, 10, 11], 8: [6, 7, 9, 11], 9: [6, 8, 10, 11], 10: [6, 7, 9, 11], 11: [7, 8, 9, 10]}

我已经返回了凸字典中具有最大长度值的键:

max_lens = [1, 6, 7, 8, 9, 10, 11]

对于max_lens中的每个号码,我想检查concave 中的中的中是不存在的。 {1}}作为convex中的键存在。

所以在这个例子中,' 1'会满足这个条件,因为它不包含在concave中作为键,但它在concave中的值是(即2,3,4和5)。

我试图找出如何使用for loops / if语句来解决这个问题:

convex

在我完全糊涂之前,这就是我所得到的。除了使用多个for循环和if语句之外,必须有一种更简单的方法吗?

我有点像一个python noob,很抱歉,如果这让人感到困惑!

5 个答案:

答案 0 :(得分:2)

认为我明白了(为了记录,我更喜欢明确的concave.keys()

result_dict = {}
for convex_key in max_lens:
    result_dict[convex_key] = convex_key not in concave.keys() \
                              and all(convex_val in concave.keys() 
                                      for convex_val in convex[convex_key])

编辑(见评论)

for convex_key in max_lens:
    if convex_key not in concave.keys() and \
           all(convex_val in concave.keys() for convex_val in convex[convex_key]):
        top_face = convex_key
        break

答案 1 :(得分:1)

将这个问题拼写成步骤总是有帮助:

  • 循环l
  • 中的每个max_lens长度
  • 检查l中是否存在concaveconvex中是否存在convex[l]。这里需要这两个条件的结合。如果失败,请不要继续。
  • 如果接受上述两个条件,请检查concave中是否存在concave = {6: [2, 3, 4, 5], 2: [6], 3: [6], 4: [6], 5: [6]} convex = {1: [2, 3, 4, 5], 2: [1, 3, 5], 3: [1, 2, 4], 4: [1, 3, 5], 5: [1, 2, 4], 6: [7, 8, 9, 10], 7: [6, 8, 10, 11], 8: [6, 7, 9, 11], 9: [6, 8, 10, 11], 10: [6, 7, 9, 11], 11: [7, 8, 9, 10]} max_lens = [1, 6, 7, 8, 9, 10, 11] for l in max_lens: if l not in concave and l in convex and all(v in concave for v in convex[l]): print(l) 的所有值。
  • 如果代码到达此处没有问题,则满足所有条件。

<强>演示:

1

<强>输出:

eslint-plugin-vue

答案 2 :(得分:0)

使用简单的forloop。

concave = {6: [2, 3, 4, 5], 2: [6], 3: [6], 4: [6], 5: [6]}
convex = {1: [2, 3, 4, 5], 2: [1, 3, 5], 3: [1, 2, 4], 4: [1, 3, 5], 5: [1, 2, 4], 6: [7, 8, 9, 10], 7: [6, 8, 10, 11], 8: [6, 7, 9, 11], 9: [6, 8, 10, 11], 10: [6, 7, 9, 11], 11: [7, 8, 9, 10]}
max_lens = [1, 6, 7, 8, 9, 10, 11]

for i in max_lens:
    if (i not in concave):   #Check if not in key.
        if convex[i] in concave.values():   #Check Value.
                print i

<强>输出

1

答案 3 :(得分:0)

你可以理解:

[i for i in max_lens if i not in concave and convex[i] in concave.values()]

答案 4 :(得分:0)

如果你不容易理解问题,通常会把它分成几个小问题:

  1. 编写一个函数,检查某个值是否不是dict的键:
  2. def is_no_key_in(v, _dict): return key not in _dict

    1. 由于这太简单了,所以返回不在dict中的键列表:
    2. def no_key_values(_list, _dict): return [ v for v in _list if is_no_key_in(v, _dict) ]

      1. 现在你只有符合你第一个条件的价值,你可以专注于你的第二个条件。由于您希望列表的每个值都在一个键列表中,您可以开始创建一个类似联合的函数:
      2. def union(a_lst, b_lst): return [ a for a in a_lst if a in b_lst]

        1. 为了使其更符合您的需求,您可以将其更改为检查任何差异的功能:
        2. def is_subset(a_lst, b_lst): return len([a for a in a_lst if a not in b_lst]) == 0

          1. 现在你将这些功能拼凑在一起:
          2. def satisfies_conditions(max_lens): for lens in no_key_values(max_lens, concave): if is_subset(convex[lens], concave.keys()) yield lens result = [ lens for lens in satisfies_conditions(max_lens) ]

            result现在包含满足您条件的所有镜头,如果您想改变条件,可以轻松完成。如果您的代码有效,您可以继续并重构它。例如,您可能不需要is_no_key_in,因为它是一个非常简单的功能。然后继续并将其内联到no_key_values

            def no_key_values(_list, _dict): return [ v for v in _list if v not in _dict ] 如果你在重构之前编写一些测试(甚至编写代码),你可以确保你的重构不会引入错误。然后逐步简化代码。也许你最终会得到一个像其他答案中提出的那样简单的解决方案。

            (我希望这也可以帮助你解决未来的问题: - ))