晚上好,
由于几天前我发现了这种奇妙的编码形式,因此我试图在列表理解方面变得更好。目前,我正在尝试使用多个if语句进行列表理解。这是我要重写的代码(供您理解)
for i in range(len(keys)):
key = keys[i]
if key == 1:
newAns = [1, 0, 0, 0]
answers.append(newAns)
elif key == 2:
newAns = [0, 1, 0, 0]
answers.append(newAns)
elif key == 3:
newAns = [0, 0, 1, 0]
answers.append(newAns)
else:
newAns = [0, 0, 0, 1]
answers.append(newAns)
这是我到目前为止所做的
answers = [i for i in keys]:
[answers.append([1, 0, 0, 0]) if i == 1]
[answers.append([0, 1, 0, 0]) if i == 2]
[answers.append([0, 0, 1, 0]) if i == 3]
[answers.append([0, 0, 0, 1]) if i == 1]
列表包含int的值,我想根据键的值将它们转换为向量。
我有些困惑,不胜感激如何完成这项任务的一些指导。谢谢。
答案 0 :(得分:4)
我们如何将所有key
和newAns
放在dict
中,并在您的列表理解中使用它们?
answer_map = {1: [1, 0, 0, 0], 2: [0, 1, 0, 0], 3: ...}
answers = [answer_map[x] if x in answer_map else [0, 0, 0, 1] for x in keys]
更新:
我完全忘记了dict.get(key, default)
(谢谢@ U9-Forward!)。您还可以说:
[answer_map.get(x, [0, 0, 0, 1]) for x in keys]
答案 1 :(得分:2)
除了@UltrInstinct的答案外,请执行get
以使if语句为否:
answer_map = {1: [1, 0, 0, 0], 2: [0, 1, 0, 0], 3: ...}
answers = [answer_map,get(x,[0, 0, 0, 1]) for x in keys]
现在:
print(answers)
符合要求。
答案 2 :(得分:0)
作为理解力的粉丝,您可以使用嵌套理解力一个衬里,如果
2n
两层带字典
[ [ 1 if i == min(k, 4) else 0 for i in range(1, 5)] for k in keys]
会更有效率。只是为了好玩,您可以使用嵌套的字典理解功能来构建字典,即使只有四个答案也不值得。
answer_dict = {1: [1, 0, 0, 0],
2: [0, 1, 0, 0] ...}
除了字典,您还可以使用列表
answer_dict = { k: [ 1 if i == k else 0
for i in range(1, 5) for k in range(1, 5)]
}
[answer_dict[min(4, k)] for k in keys]
答案 3 :(得分:0)
如果您想要一个荒谬的单行代码,您可以使用嵌套的三元表达式。
In [4]: keys = [2, 1, 1, 3, 0, 2]
In [5]: result = [
...: [1,0,0,0] if key == 1 else
...: [0,1,0,0] if key == 2 else
...: [0,0,1,0] if key == 3 else
...: [0,0,0,1]
...: for key in keys
...: ]
In [6]: result
Out[6]:
[[0, 1, 0, 0],
[1, 0, 0, 0],
[1, 0, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1],
[0, 1, 0, 0]]
但是,最好将逻辑包装在一个函数中并在列表理解中调用该函数:
In [7]: def f(key):
...: if key == 1:
...: result = [1, 0, 0, 0]
...: elif key == 2:
...: result = [0, 1, 0, 0]
...: elif key == 3:
...: result = [0, 0, 1, 0]
...: else:
...: result = [0, 0, 0, 1]
...: return result
...:
In [8]: [f(key) for key in keys]
Out[8]:
[[0, 1, 0, 0],
[1, 0, 0, 0],
[1, 0, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1],
[0, 1, 0, 0]]
在这种情况下,dict
也可以很好地工作,如其他答案所示。通常,不要试图将很多东西塞进一个列表列表中。