带条件调用的字典理解嵌套列表理解

时间:2019-09-05 08:18:29

标签: python list-comprehension dictionary-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)中尚未定义filter_confidence_intervals。

有什么办法解决吗?

2 个答案:

答案 0 :(得分:3)

您可以将在两个置信区间上应用的两个条件放在一个语句中。另外,无论如何,我建议将置信区间的过滤放在列表理解语句中。

两个条件:

  1. 置信区间>阈值(if i > threshold
  2. 一个或多个置信区间大于阈值(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语句更快

相关问题