将字典值转换为集合?

时间:2018-04-30 22:28:37

标签: python dictionary set

如何将dictionary1变成dictionary2?基本上,我想将所有字典值转换为集合,以便字典值中没有重复。

我试图做dictionary2 = set(dictionary1.values()),但这个功能没有给我我想要的东西。

dictionary1 = {
    'cat': ['frog', 'frog'] ,
    'dog': ['deer', 'deer', 'deer', 'goat'],
    'bat': ['apes,' 'mice', 'mice'] }

dictionary2 = {
    'cat': ['frog'] ,
    'dog': ['deer', 'goat'],
    'bat': ['apes,' 'mice'] }

2 个答案:

答案 0 :(得分:2)

function calculateRowMultiply()
{
    $('table tr:has(td):not(:last)').each(function(){
       var m = 1; $(this).find('td').each(function(){
          m *= parseFloat($(this).find('.saisie').val()) || 1;
        });
           $(this).find('td:last').html(m);
    });
}

答案 1 :(得分:0)

调用dictionary2 = set(dictionary1.values())的问题是dictionary1.values()只返回dictionary1中每个值的列表。这些值中的每一个本身都是一个列表(例如['frog', 'frog'].values()列表的一个元素)。在多维列表上调用set()(这里发生的事情)会导致TypeError: unhashable type: 'list',因为set()只接受不可变(可散列)对象的列表,但列表是可变的。有关详情,请参阅this question

除此之外,在set()上调用dictionary1.values()实际上只会减少值列表,这样就不会重复动物列表。换句话说,set([('mouse', 'mouse'), ('mouse', 'mouse')])会产生{('mouse', 'mouse')}而非{('mouse'), ('mouse')},我认为这更接近您所寻找的内容。 (注意:在这里使用元组,因为它们是不可变的)

您要做的是在set()中的每个值上调用list()(然后使用dictionary1.values()强制转回列表)并在新词典。这可以通过字典理解来完成(类似于更常见的列表理解)。

以下是如何做到这一点:

dictionary1 = {'cat': ['frog', 'frog'] , 'dog': ['deer', 'deer', 'deer', 'goat'], 'bat': ['apes', 'mice', 'mice'] }
dictionary2 = {key: list(set(value)) for key, value in dictionary1.items()}

上面的代码导致:

dictionary1 #=> {'cat': ['frog', 'frog'] , 'dog': ['deer', 'deer', 'deer', 'goat'], 'bat': ['apes', 'mice', 'mice'] }
dictionary2 #=> {'cat': ['frog'], 'dog': ['goat', 'deer'], 'bat': ['apes', 'mice']}

根据需要。