[英]dictionary-comprehension with conditional calling nested list-comprehension
我有一个键和列表字典。 我想迭代字典,获取每个列表,遍历每个列表并应用条件,然后将过滤后的列表附加到新字典。
该功能已经势在必行。 我可以使用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)中定义filtered_confidence_intervals。
有什么方法吗?
您可以将您在每个置信区间上应用的两个条件放在一个语句中。 此外,我建议在任何情况下都将置信区间的过滤放在列表推导语句中。
这两个条件:
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
-loops,但我想这是品味和使用的问题。
如果你想保持for
-looping:
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的linter的评论的注释,指出尚未定义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
您可以使用:
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)}
通过这种方式,您可以检查您的filtered_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语句更快
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.