如何将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'] }
答案 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']}
根据需要。