簡體   English   中英

在列表理解中使用“else”

[英]Using an 'else' in list comprehension

我正在使用 Python 並且我正在預測時裝模特圖像中存在的服裝屬性。 預測是使用以下代碼構建的:

ATTRIBUTE RECOGNITION MODEL

#Importing necessary libraries
import torch
import torchvision.models as models
from torchvision import transfor
from torch.autograd import Variable
from PIL import Image
import torch.nn as nn
import numpy as np

#Defining the functions to load and use the model
def get_tensor(img):
    tfms = transforms.Compose([
    transforms.Resize((256, 256)),
    transforms.ToTensor()
    ])
    return tfms(Image.open(img)).unsqueeze(0)


def predict(img, label_lst, model):
    tnsr = get_tensor(img)
    op = model(tnsr)
    op_b = torch.round(op)
    op_b_np = torch.Tensor.cpu(op_b).detach().numpy()
    preds = np.where(op_b_np ==1)[1]
    sigs_op = torch.Tensor.cpu(torch.round((op)*100)).detach().numpy()[0]
    o_p = np.argsort(torch.Tensor.cpu(op).detach().numpy())[0][::-1]
    label = []
    for i in preds:
        label.append(label_lst[i])
    arg_s = {}
    for i in o_p:
        arg_s[label_lst[int(i)]] = sigs_op[int(i)]
    return label, list(arg_s.items())[:10]

#Load the model

labels = open(ATTRIBUTE_PATH, 'r').read().splitlines()

model = torch.load(ATTRIBUTE_MODEL_PATH, map_location=torch.device('cpu'))
model = model.eval()

#Use the model to iterate over the rows of our clothing dataframe and adding a column with the predictions
predictions=[]
for x in df_images["Media"]:
    p= predict(x, labels, model)
    predictions.append(p)
    
    
out = [[i for i, v in lst if v > -200 else i == i[0]] for _, lst in predictions]
df_images["Attributes"] = out
df_images.head()

以上對我來說很好。 我正在 i,v 中檢索 i 的所有值,其中 v > -200。

但是,我想添加一個 else 條件指定,如果 i, v 中的 i 沒有值,其中 v > -200,則返回 i[0] for i in i, v。(即 i 其中 v 是最高的一,五)

我想這樣做的原因是因為對於某些圖像,現在正在返回屬性預測,因為它們不符合 -200 的閾值。 因此,因為我想從已識別的可能屬性列表中返回最可能的屬性。

這是我迄今為止嘗試過的,但它不起作用:

out = [[i for i, v in lst if v > -200 else i == i[0]] for _, lst in predictions]

謝謝您的幫助

我想你的意思是:

out = [[i for i, v in lst if v > -200] or [lst[0][0]] for _, lst in predictions]

然而,正如您所看到的,它也很難理解並解釋它的作用,這意味着有時最好以顯式形式編寫代碼:

out = []
for _, lst in prediction:
   member = [i for i, v in lst if v > -200]
   if not member:
       member = [lst[0][0]]
   out.append(member)

注意第一種形式:Python 中的運算符“或”和“與”與大多數其他二元運算符的行為不同。 如果它具有“真”值,“或”將評估其左側的 object,否則評估右側的 object(無論它是否具有真值)。 然后,在 Python 中,一個空序列有一個“假”值(它的計算結果為 boolean 假),因此,如果由“>-200”保護過濾的元素最終為空,則其中的“或”將選擇右邊表達式的結果。

暫無
暫無

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

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