我有一个按键和列表的字典。我想遍历字典,获取每个列表,遍历每个列表并应用条件,然后将该过滤后的列表附加到新字典中。
该功能已经强制执行。我可以使用list和dict理解功能吗?主要的阻止因素是包装dict-comp具有一个条件,该条件需要list-comp的长度。
在这里它势在必行:
filtered_prediction_dict = {}
for prediction, confidence_intervals in prediction_dict.items():
filtered_confidence_intervals = []
for i in confidence_intervals:
if i > threshold:
filtered_confidence_intervals.append(i)
if len(filtered_confidence_intervals) >= 1:
filtered_prediction_dict[prediction] = filtered_confidence_intervals
我想知道我是否可以通过理解来在功能上做同样的事情,像这样:
filtered_prediction_dict = {prediction: [i for i in confidence_intervals if i > threshold] for prediction, confidence_intervals in prediction_dict.items() if len(filtered_confidence_intervals) >= 1}
当然,python的linter指出条件len(filtered_confidence_intervals)中尚未定义filter_confidence_intervals。
有什么办法解决吗?
答案 0 :(得分:3)
您可以将在两个置信区间上应用的两个条件放在一个语句中。另外,无论如何,我建议将置信区间的过滤放在列表理解语句中。
两个条件:
if i > threshold
)len(filtered_confidence_intervals) >= 1
)以单个语句表示:
any(ci > threshold for ci in confidence_intervals)
生成的列表理解版本(为便于阅读而拆分):
{
p: [ci for ci in cis if ci > threshold] # only keep ci > threshold
for p, cis in prediction_dict.items() # iterate through the items
if any(ci > threshold for ci in cis) # only consider items with at least one ci > threshold
}
恕我直言,它的可读性不比for
循环好,但是我想这是一种品味和使用问题。
如果要保持for
循环:
filtered_prediction_dict = {}
for prediction, confidence_intervals in prediction_dict.items():
if any(ci > threshold for ci in confidence_intervals):
filtered_prediction_dict[prediction] = [ci for ci in confidence_intervals if ci > threshold]
关于python短绒的评论注释,指出filtered_confidence_intervals
尚未定义:
很多时候,短绒很准确,这种情况也不例外。 filtered_confidence_intervals
是在prediction_dict
中为每个项目定义的,因此您无法遍历prediction_dict
并测试filtered_confidence_intervals
的长度。
您需要替换以下语句:
len(filtered_confidence_intervals) >= 1
在列表理解中
len([ci for ci in confidence_intervals if ci > threshold]) >= 1
答案 1 :(得分:2)
您可以使用:
filtered_prediction_dict = {prediction: [i for i in confidence_intervals if i > threshold] for prediction, confidence_intervals in prediction_dict.items() if any(e >= threshold for e in confidence_intervals)}
通过这种方式,您检查您的filter_prediction_dict是否没有空列表
或者您可以使用:
filtered_prediction_dict = {prediction: [i for i in confidence_intervals if i > threshold] for prediction, confidence_intervals in prediction_dict.items() if max(confidence_intervals) >= threshold}
第二个版本对列表中的每个元素进行两次迭代,第一个版本具有一些冗余迭代,但是即使如此,这两种解决方案也可能比使用for语句更快