比python中两个for循环(嵌套)更好的方法

时间:2020-10-12 16:31:19

标签: python python-3.x python-2.7

我有两个字典,想要映射值,如果两个映射的键都打印了,请打印,请注意这里的键可以大于两个,所以要动态。 [如果在键dict中添加了键,则还将在dict a中为其添加值。]

a = {
  'value1': 1,
  'value2': 2
}

b = {
  'keys': {
    'key1': 'value1',
    'key2': 'value2'
  },
  'mapping': [{
      'check': {
        'key1': 3,
        'key2': 4
      }
    },
    {
      'check': {
        'key1': 5,
        'key2': 6
      }
    },
    {
      'check': {
        'key1': 1,
        'key2': 2
      }
    }
  ]
}

for i in b['mapping']:
  flag = True
for key, value in b['keys'].items():

  if not a.get(value) == i['check'][key]:
  flag = False
break

if flag:
  print('yes')
break

在这里您可以看到键值实际上是“ dict a”的键。

编写了上面的代码,但是在python中有更好的方法做到这一点。

2 个答案:

答案 0 :(得分:1)

通常,如果有一个循环,您可以在该循环中设置或清除标志,然后根据条件中断,则可以将其替换为anyall

在这种情况下,

flag = True
for key, value in b['keys'].items():
    if not a.get(value) == i['check'][key]:
        flag = False
        break

可以替换为

flag = all(a.get(value) == i['check'][key] for key, value in b['keys'].items())

答案 1 :(得分:0)

假设这些值是可散列的(例如,int,如图所示),则可以将它们变成用于比较的集合。

wanted = set((b_key, a[b_value]) for b_key, b_value in b["keys"].items())

for check_dict in b['mapping']:
    check = set(check_dict['check'].items())
    if wanted.issubset(check):
        print("yes")
        break

向mkrieger1点头,可以将其压缩为

wanted = set((b_key, a[b_value]) for b_key, b_value in b["keys"].items())
if any(wanted.issubset(set(check_dict['check'].items()))
        for check_dict in b['mapping']):
    print("yes")
相关问题