簡體   English   中英

多個 if 語句列表理解

[英]Multiple if statements list comprehension

晚上好,

自從幾天前我發現了這種奇妙的編碼形式以來,我正在努力提高列表理解能力。 目前我正在嘗試使用多個 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]

該列表包含整數值,我想根據鍵的值將它們轉換為向量。

我有點卡住了,希望能得到一些關於如何處理這項任務的指導。 謝謝你。

我們把所有的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]

附加@ 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)

將輸出所需的輸出。

作為理解的粉絲,您可以使用嵌套理解單襯,如果

[ [ 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]   

除了字典,您還可以使用列表

answers = [ [ 1 if i == k else 0
                   for i in range(1, 5) for k in range(0, 5)]]

[answers[min(4, k)] for k in keys] 

如果你想要一個荒謬的單行,你可以使用嵌套的三元表達式。

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很好地工作,如其他答案中所示。 一般來說,不要試圖將一堆東西塞進一個列表理解中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM