请考虑以下两个变量:
a = [1, 2, 3, 4]
b = {
'OK': [1, 3],
'BAD': [2, 4]
}
请注意,1
中的a
与1
中的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)
从表面上看,这两个似乎无关,但我不禁要想,肯定有一种更好的方法让我在这里失踪...
谢谢!
答案 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