【问题标题】:Python dict keys as statements [closed]Python dict键作为语句[关闭]
【发布时间】:2018-11-11 17:31:18
【问题描述】:

想知道以下是否可行:

rarity = {>= 75: 'Common', <= 20 : 'Rare', >= 5: 'Legendary'}

【问题讨论】:

标签: python python-3.x dictionary conditional


【解决方案1】:

在 Python 2.7 中,这将引发语法错误。感觉就像滥用字典(键值存储)概念。也许你应该重写你的代码,你可以使用'Common''Rare'作为键和值作为范围,即range(5,20)range(20)等。

【讨论】:

    【解决方案2】:

    这不能用 python 中的dict 来完成。您可能需要一个普通函数来完成您的任务:

    def check(x):
        if x >= 75:
            return 'Common'
        if x <= 20:
            ...
    

    记住检查顺序和return 语句很重要。

    【讨论】:

    • 这个问题非常不清楚,但有一些方法可以使用这样的字典,例如x = 6; {x &gt;= 75: 'Common', x&lt;= 20 : 'Rare', x&gt;= 5: 'Legendary'}[True]
    • @Chris_Rands 除了 OP 犯了一个错误,因为 Rare 它应该是 x&gt;=20 如果你在你的代码中使用它,你会看到只有最后一个 true 条件会被返回。所以你的代码将失败x=25
    • @anishtain4 我们只能猜测问题是什么,但假设单个整数输入的单个输出(也在 Ivan 的代码中假设),它可以像我上面显示的那样在 dict 中完成跨度>
    • @Chris_Rands 是的,这是一个写得很糟糕的问题。但是很明显,OP 正在寻找一种简短的开关形式。我一般看不出任何开关命令的理由,if ... elif 做同样的工作。
    【解决方案3】:

    我找不到比 O(k) 性能更好的方法,其中 k 是您的字典中的键数。

    如果您不追求dict 的O(1) 性能,而只是想要类似dict 的语法,您可以自己实现一个映射对象,如下所示:

    from collections.abc import Mapping
    
    class CallDict(Mapping):
        def __init__(self, *pairs):
            self._pairs = pairs
        def __iter__(self):
            return iter(())
        def __len__(self):
            return len(self._pairs)
        def __getitem__(self, x):
            for func, value in self._pairs:
                if func(x):
                    return value
            raise KeyError("{} satisfies no condition".format(x))
    
    # Conditions copied directly from OP, but probably wrong.
    cd = CallDict(
        ((lambda x: x >= 75), "Common"),
        ((lambda x: x <= 20), "Rare"),
        ((lambda x: x >= 5), "Legendary"),
    )
    
    
    assert cd[1] == 'Rare'
    assert cd[10] == 'Rare'
    assert cd[50] == 'Legendary'
    assert cd[100] == 'Common'
    

    【讨论】:

    • 请注意,我不提倡为这种特殊情况创建 Mapping 对象。对于这样一个简单的案例,我更愿意看到rarity = HowRareIsIt(10)。但是知道一个可以创建一个映射对象可能对其他类似的情况很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2017-07-04
    • 1970-01-01
    • 2023-03-06
    • 2021-09-13
    • 1970-01-01
    • 2022-11-21
    相关资源
    最近更新 更多