【问题标题】:dictionary-comprehension with conditional calling nested list-comprehension字典理解与条件调用嵌套列表理解
【发布时间】:2020-01-08 02:32:07
【问题描述】:

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

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

有什么办法吗?

【问题讨论】:

  • "I was wondering if I could do the same thing functionally with comprehensions" 请不要,如果您想在 1 周后了解您的代码,请不要这样做
  • 只需将filtered_confidence_intervals 设为列表解析,其余部分保持原样。
  • 这些答案有帮助吗?
  • 是的,我希望有一种元方法可以避免计算列表理解两次,但这似乎是不可避免的。 any() 函数很有用。

标签: python list-comprehension dictionary-comprehension


【解决方案1】:

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

两个条件:

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

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

【讨论】:

    【解决方案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 语句更快

    【讨论】:

      猜你喜欢
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多