【问题标题】:Conditionals in dict comprehensionsdict理解中的条件
【发布时间】:2016-04-28 10:46:09
【问题描述】:

我正在尝试简化修改大量更改数字的大量字典(从日期字符串到 python 日期,从十进制到浮点数等),并且我希望能够确定是否需要更改某些内容(也许我只想更改一些数字,而不是日期):

def transform_dictionary(dictionary, callback, qualification_callback=None):
    if qualification_callback:
        dictionary.update({k: callback(v) for k, v in dictionary.items() if qualification_callback(v) else k: v})
    else:
        dictionary.update({k: callback(v) for k, v in dictionary.items()})
    return dictionary

d = {'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5}

def bigger_than_two(number):
    return number > 2

def double_it(number):
    return number * 2

transform_dictionary(d, double_it, bigger_than_two)

# expecting {'one': 1, 'two': 2, 'three': 6, 'four': 8, 'five': 10}

transform_dictionary(d, double_it)

# expecting {'one': 2, 'two': 4, 'three': 6, 'four': 8, 'five': 10}

我正在阅读有关 dict 理解的内容,但没有找到一种方法来做我想做的事,要么进行我的计算,要么保持值不变。有没有办法从上面得到我想要的结果?

【问题讨论】:

  • 有什么理由需要字典理解吗?
  • 您犯了一个相当常见的错误,即混淆了理解的过滤子句中的if whatever 和条件表达式x if whatever else y 中的if whatever。您要编写的是条件表达式,但由于特定于理解的过滤器语法看起来是一样的,您试图将 if whatever 放在过滤器所在的位置。
  • 我只是认为理解是最简单的。我希望能够转换符合大字典标准的字典值
  • 你只有 double_it 和 big_than_two,还是有更多?
  • 我会确切地知道我想做什么以及为什么在这种情况下,例如将所有 Decimal 类转换为 4 位浮点数,将所有“2015-03-15”字符串转换为日期等

标签: python python-3.x dictionary dictionary-comprehension


【解决方案1】:

这样的理解可以做你想做的事

def transform_dictionary(dictionary, callback, qualification_callback=None):
        return {k: callback(v) if (qualification_callback and qualification_callback(v)) or not qualification_callback else v for k, v in dictionary.items()}

【讨论】:

  • 所以从k:for循环是指对值做什么,v?
  • 正确,这就是选择使用哪个值的逻辑
  • 不知道该感谢还是感谢python,那就干净了。谢谢
  • 你也可以在这些推导中的多个可能的键之间进行选择吗?
  • qualification_callback 参数被忽略时,这不会给 OP 提供预期的输出。你的字典理解应该是{k: callback(v) if qualification_callback and qualification_callback(v) or not qualification_callback else v for k, v in dictionary.items()}
【解决方案2】:

带条件的字典推导式采用以下结构:

new_dict = {key:VALUE_1 if CONDITION_1
            else VALUE_2 if CONDITION_2
            else VALUE_3 for key in myDict.keys()}

这是一个简单的例子,希望你能看到它是如何工作的,并修改为 适合您的特定应用。

myDict = {"a": 4, "b": 7, "c": 55, "d": 432}
new_dict = {key:"greater than 100" if (myDict[key] > 100)
            else "10 to 100" if myDict[key] > 10
            else "10 or less" for key in myDict.keys()}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-12
    • 2018-07-05
    • 2021-06-18
    • 2020-09-17
    • 2023-03-23
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多