【问题标题】:Making a set from dictionary values从字典值中创建一个集合
【发布时间】:2015-01-30 02:44:23
【问题描述】:

我想根据现有字典的值创建一个集合

def function(dictionary):
    ... 
    return set_of_values

假设我的字典是这样的:{'1': 'Monday', '2': 'Tuesday', '3': 'Monday'}

我希望返回一个只包含唯一值的集合,如下所示:

{'Monday', 'Tuesday'}

【问题讨论】:

    标签: python dictionary set


    【解决方案1】:

    对于 Python:

    set(d.values())
    

    在 Python 2.7 上等效:

    set(d.viewvalues())
    

    如果您需要交叉兼容的 Python 2.7/3.x 代码:

    {d[k] for k in d}
    

    【讨论】:

    • 一件小事:在 2.7 中,viewvalues 可能比 itervalues 快。而且它也更符合 3.x 的行为。但是当然你的代码在 2.6 和更早版本中不起作用。
    • @abarnert 你觉得set(my_dict[k] for k in my_dict)...认为这应该适用于任何地方...
    • @JonClements:Nick Coghlan 有一篇不错的博客文章建议编写需要在 2.x 和 3.x 中高效的代码的正确方法是编写一个包装器(或在现有项目,如sixmodernize),然后使用它。是的,它是一个顶级函数而不是一个方法,但是谁在乎呢?所以,set(viewvalues(my_dict)).
    • @JonClements:我真的不知道six 是否有viewvalues,但我敢肯定它至少有itervalues,或者你自己的包装器大约需要 30 秒,例如 this
    • @abarnert 我相信我已经读过了。我只是把那个扔在那里,因为提到了 values()/itervalues()viewvalues() - 唯一的其他选择是 set-comp (但这就像 view* 方法一样是 2.7)
    【解决方案2】:

    另一种独特的方式:

     >>> my_dict = {'1': 'Monday', '3': 'Monday', '2': 'Tuesday'}
     >>> {y:x for x,y in my_dict.iteritems()}.keys()
     ['Tuesday', 'Monday']
     >>>
    

    【讨论】:

    • 为什么他需要设置只是为了唯一的值吗?
    • 取决于你如何解释:我想要的是一个集合...后跟set 文字的示例...
    • 为什么要构建一个值无关紧要的反向字典,只是将其用作假集合,只是将其中的键复制到字典中?
    • 这就是为什么我提到“另一种独特的方式:”
    • 但这并不是真正的另一种方式,它只是同一事物的一种模糊且低效的变体。您的 dict 使用哈希表的方式与 wim 的设置完全相同,只是您的 dict 也无缘无故地填充了该哈希表的值。如果你想要一个实际的“另一种方式”,你可以,例如,排序并丢弃相等的相邻值(如果,例如,这些值不是可散列的,这可能很有用——尽管考虑到 OP 想要一个集合,那可以'这不是问题)。
    猜你喜欢
    • 2022-10-05
    • 2022-11-17
    • 2019-06-15
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多