多个if语句列表理解

时间:2018-10-25 23:53:44

标签: python

晚上好,

由于几天前我发现了这种奇妙的编码形式,因此我试图在列表理解方面变得更好。目前,我正在尝试使用多个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的值,我想根据键的值将它们转换为向量。

我有些困惑,不胜感激如何完成这项任务的一些指导。谢谢。

4 个答案:

答案 0 :(得分:4)

我们如何将所有keynewAns放在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也可以很好地工作,如其他答案所示。通常,不要试图将很多东西塞进一个列表列表中。