在列表理解中使用 '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 in i, v where v > -200 没有值,return i[0] for i in i, v。(即 i 其中 v 在 i,v)
中最高
我想这样做的原因是因为对于某些图像,现在正在 return 编辑属性预测,因为它们不符合 -200 的阈值。因此,我想 return 从已识别的可能属性列表中找出最有可能的属性。
这是我到目前为止尝试过的方法,但没有用:
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 中的运算符“or”和“and”的行为与大多数其他二元运算符不同。如果“或”具有“真实”值,则“或”将对其左侧的对象求值,否则对右侧的对象求值(无论它是否具有真值)。
然后,在 Python 中,一个空序列有一个“falsy”值(它的计算结果为布尔值 False),因此,如果由“> -200”守卫过滤的元素最终为空,则“or”在那里会选择右边表达式的结果。
我正在使用 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 in i, v where v > -200 没有值,return i[0] for i in i, v。(即 i 其中 v 在 i,v)
中最高我想这样做的原因是因为对于某些图像,现在正在 return 编辑属性预测,因为它们不符合 -200 的阈值。因此,我想 return 从已识别的可能属性列表中找出最有可能的属性。
这是我到目前为止尝试过的方法,但没有用:
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 中的运算符“or”和“and”的行为与大多数其他二元运算符不同。如果“或”具有“真实”值,则“或”将对其左侧的对象求值,否则对右侧的对象求值(无论它是否具有真值)。 然后,在 Python 中,一个空序列有一个“falsy”值(它的计算结果为布尔值 False),因此,如果由“> -200”守卫过滤的元素最终为空,则“or”在那里会选择右边表达式的结果。