列表和字典交替循环的Python方式(组合)

时间:2019-06-08 11:15:06

标签: python-3.x

请考虑以下两个变量:

a = [1, 2, 3, 4]
b = {
    'OK': [1, 3],
    'BAD': [2, 4]
}

请注意,1中的a1中的b['OK']基本相同。

注意: a似乎无关紧要,但是可以按照此处显示的顺序(不可可排序,btw)保持项目的顺序下面的示例。

遍历这两个变量以有效地获得这两个结果的最Python方式是什么:

1: OK
2: BAD
3: OK
4: BAD

OK: 1
OK: 3
BAD: 2
BAD: 4

这是我能想到的最直接的方法:

if True:
    for i in a:
        for k,v in b.items():
            if i in v:
                do_stuff(i, k)
                break
else:
    for k,v in b.items():
        for i in v:
            do_stuff(k, i)

从表面上看,这两个似乎无关,但我不禁要想,肯定有一种更好的方法让我在这里失踪...

谢谢!

3 个答案:

答案 0 :(得分:1)

这应该可以解决问题:

for k,v in b.items(): 
    for elem in v: 
        if elem in a:
            print('{}:{}'.format(elem,k))

这是假设两个元素的打印结果应包含a中的所有元素。如果不是这种情况,则只需删除if语句,您的代码将仅使用变量b

赞:

for k,v in b.items(): 
    for elem in v: 
        print('{}:{}'.format(elem,k))

答案 1 :(得分:1)

给出起点:

 Image Name      Tag

image1          Political
image2          Non-political
.               .
.               .
.               .
image1000       Political

创建key-> position的查找字典以进行有效查找:

a = [1, 2, 3, 4]
b = {
    'OK': [1, 3],
    'BAD': [2, 4]
}

使用gen-exp展平键和列表中的每个值:

order = {v: i for i, v in enumerate(a)}

对元素进行排序,使其按flattened = ((k, v) for k, lst in b.items() for v in lst) 中的优先级排序(您可能希望为a指定一个默认值,例如.get(将未找到的值放在一切)或float('-inf')(将所有未找到的值放在所有内容之后)-如果您希望查找失败...):

float('inf')

这给您:

res = sorted(flattened, key=lambda L: order.get(L[1]))

答案 2 :(得分:0)

我不确定您为什么需要if else语句... 没有它,您的方法似乎可以工作

a = [1, 2, 3, 4]
b = {
    'OK': [1, 3],
    'BAD': [2, 4]
}

for num in a:
    for key, value_list in b.items():
        if num in value_list:
            print("{0}: {1}".format(key, num))

输出

OK: 1
BAD: 2
OK: 3
BAD: 4

要获取第二个输出,可以使用以下内容

for key, value_list in b.items():
    for value in value_list:
        print("{0}: {1}".format(key, value))

根本不会使用a并且会给出

OK: 1
OK: 3
BAD: 2
BAD: 4

如果a的顺序不同,而您希望组内的输出按照该顺序使用,则可以使用

a = [3, 2, 4, 1]
b = {
    'OK': [1, 3],
    'BAD': [2, 4]
}

for key, value_list in b.items():
    for num in a:
        if num in value_list:
            print("{0}: {1}".format(key, num))

会输出

OK: 3
OK: 1
BAD: 2
BAD: 4

或者,您可以使用诸如{1:'OK'}

之类的条目来创建列表。
c = [{1:'OK'}, {2:'BAD'}, {3:'OK'}, {4:'BAD'}]

for elem in c:
    print(elem)

print("or")

for elem in c:
    for key, value in elem.items():
        print("{0}: {1}".format(key, value)) 

输出

{1: 'OK'}
{2: 'BAD'}
{3: 'OK'}
{4: 'BAD'}
or
1: OK
2: BAD
3: OK
4: BAD