4

我有一个键和列表字典。我想遍历字典,获取每个列表,遍历每个列表并应用条件,然后将该过滤列表附加到新字典。

该功能已经强制运行。我可以用列表和字典理解在功能上做同样的事情吗?主要的障碍是包装 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指出filtered_confidence_intervals还没有在条件的len(filtered_confidence_intervals)中定义。

有什么办法吗?

4

2 回答 2

3

您可以将应用于每个置信区间的两个条件放在一个语句中。另外,我建议在任何情况下都将置信区间的过滤放在列表理解语句中。

两个条件:

  1. 置信区间 > 阈值 (the if i > threshold)
  2. 一个或多个置信区间大于阈值 (the 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循环:

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尚未定义:

很多时候,linter 非常准确,这种情况也不例外。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
于 2019-09-05T08:37:38.430 回答
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)}

通过这种方式,您可以检查您的 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 语句更快

于 2019-09-05T08:26:27.970 回答