Python 将一个dict除以一个数字(int)

Python 将一个dict除以一个数字(int),python,dictionary,int,counter,divide,Python,Dictionary,Int,Counter,Divide,我有个问题,我必须创建一个函数,将我的dict除以int。 这是我的格言: Counter({1: [9, 10, 1], 2: [5, 1, 1, 2, 1, 1, 9, 1, 1, 1, 3, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, 1, 3, 4, 1, 1, 1, 3, 1, 4, 1, 1, 1, 1], 0: [1, 5, 1, 1, 2, 10, 1, 2, 1,

我有个问题,我必须创建一个函数,将我的dict除以int。 这是我的格言:

Counter({1: [9, 10, 1], 2: [5, 1, 1, 2, 1, 1, 9, 1, 1, 1, 3, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, 1, 3, 4, 1, 1, 1, 3, 1, 4, 1, 1, 1, 1], 0: [1, 5, 1, 1, 2, 10, 1, 2, 1, 2, 2, 1, 1]})
这是我的职责:

def probabilitacondizionata(lista, sommafreq):
    lista= {k: v / sommafreq for k, v in lista.items()}
    return lista
这是一个函数,它求和值(int)sommafreq:

def sommafrequenze(lista):
    sommafreq= sum(lista.values())
    return sommafreq
此指令导致以下错误:不支持/:'dict_values'和'int'的操作数类型

我想要的输出是:

Counter({1: [9/sommafreq, 10/sommafreq, 1/sommafreq], 2: [5/sommafreq, 1sommafreq, 1/sommafreq, 2/sommafreq, 1/sommafreq, 1/sommafreq, 9, 1, 1, 1, 3, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, 1, 3, 4, 1, 1, 1, 3, 1, 4, 1, 1, 1, 1], 0: [1, 5, 1, 1, 2, 10, 1, 2, 1, 2, 2, 1, 1]})
然后继续把所有的。。对不起,我的英语不好,提前谢谢你

编辑:我以前的功能:

def ricercafrequenze(trainspam, testspam):
    filtratespam=Counter()
    filtratespam ={k:v for (k,v) in trainspam.items() if k in testspam}

    return filtratespam
    #main
def ricerchefrequenzeinlista(lista1,lista2):
    lista=Counter()
    i=0
    while i < len(lista2):
       lista[i]=(ricercafrequenze(lista1, lista2[i]))
       i+=1
    return lista

Counter({0: {'offer': 1, 'time': 5, 'discount': 1, 'one': 1, 'th': 2, 'subject': 10, 'special': 1, 'need': 2, 'price': 1, 'order': 2, 'product': 2, 'per': 1, 'today': 1}, 1: {'us': 9, 'subject': 10, 'buy': 1}, 2: {'time': 5, 'realist': 1, 'quickli': 1, 'give': 2, 'go': 1, 'thoma': 1, 'us': 9, 'let': 1, 'aruba': 1, 'natur': 1, 'b': 3, 'length': 1, 'ca': 1, 'one': 1, 'know': 2, 'life': 1, 'think': 1, 'girlfriend': 1, 'use': 2, 'stronger': 1, 'press': 1, 'longer': 1, 'fl': 1, 'po': 1, 'partner': 1, 'subject': 10, 'presid': 1, 'save': 1, 'nearli': 1, 'stud': 1, 'short': 1, 'everi': 3, 'gain': 1, 'citi': 1, 'product': 2, 'said': 1, 'increas': 1, 'month': 1, 'unit': 3, 'want': 4, 'must': 1, 'sex': 1, 'pleasur': 1, 'result': 3, 'matt': 1, 'name': 4, 'love': 1, 'bigger': 1, 'visitor': 1, 'oranjestad': 1}})
def ricercaffrequenze(列车垃圾邮件、测试垃圾邮件):
filtesPAM=计数器()
filtesPAM={k:v表示trainspam.items()中的(k,v)如果testspam中的k}
返回过滤器
#主要
def ricerchefrequenzeinlista(列表A1、列表A2):
lista=计数器()
i=0
而我
您有两种可能:

1.使用
numpy
(因为您有dicts as lista值,这不适用):

2.使用听写理解:

    def probabilitacondizionata(lista, sommafreq):
        lista= {k: {k_i: v_i / sommafreq for k_i, v_i in v.items()} for k, v in lista.items()}
        return lista

如注释中所述,您可以计算总和,然后除以一个值以获得相同的结果。无论如何,您可以像这样分割每个元素:

Counter({k:[i/sommafreq for i in v] for k,v in lista.items()}) 

如果
sommafrequenze
功能专用于汇总初始列表的值-使用以下简化方法:

def probabilitacondizionata(lista, sommafreq):
    lista = {k: [v / sommafreq for v in v] for k, v in lista.items()}
    return lista

l = {1: [9, 10, 1], 2: [5, 1, 1, 2, 1, 1, 9, 1, 1, 1, 3, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, 1, 3, 4, 1, 1, 1, 3, 1, 4, 1, 1, 1, 1], 0: [1, 5, 1, 1, 2, 10, 1, 2, 1, 2, 2, 1, 1]}
l_sum = sum(v for sublist in l.values() for v in sublist)

print(probabilitacondizionata(l, l_sum))
输出:

{0: [0.007194244604316547, 0.03597122302158273, 0.007194244604316547, 0.007194244604316547, 0.014388489208633094, 0.07194244604316546, 0.007194244604316547, 0.014388489208633094, 0.007194244604316547, 0.014388489208633094, 0.014388489208633094, 0.007194244604316547, 0.007194244604316547], 1: [0.06474820143884892, 0.07194244604316546, 0.007194244604316547], 2: [0.03597122302158273, 0.007194244604316547, 0.007194244604316547, 0.014388489208633094, 0.007194244604316547, 0.007194244604316547, 0.06474820143884892, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.02158273381294964, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.014388489208633094, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.014388489208633094, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.07194244604316546, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.02158273381294964, 0.007194244604316547, 0.007194244604316547, 0.014388489208633094, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.02158273381294964, 0.02877697841726619, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.02158273381294964, 0.007194244604316547, 0.02877697841726619, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547]}

我经常想在不使用dict理解的情况下做这类事情。是我的一个小项目,它扩展了Python dicts/Counters/defaultdicts/OrderedDicts,允许它们被合并,或者用于标量或其他dicts的算术。 乙二醇


为什么不直接将总和除以呢?您需要将列表中的每一项除以:
{k:[x/sommafreq for x in v]for…}
,但是你当前的代码不应该给出你声称的错误。你能提供一个完整的回溯吗?谢谢,但是,我给了我这个错误:AttributeError:“dict_values”对象没有属性“items”,这对我的建议没有问题;
lista
显然是字典的值,而不是字典本身。谢谢,但是,我给出了告诉我这个错误:AttributeError:“dict_values”对象没有属性“items”-@ErikGodard,没有python 2也有items(),所以这不是python 2/3的问题。可能是OP正在列表上应用
。items()
。不,我使用python 3.5版:(问题可能是sommafreq的类型吗?它是一个int@DavideDiMenna,不,我已经用int值对它进行了测试,这很好。问题出在您这边。您能给我们看一下
打印类型(lista)
的输出吗?感谢这两种解决方案,我尝试了第一种:TypeError:不支持的操作数类型对于/:“dict_values”和“int”以及第二个但是,它给了我这个错误:AttributeError:“dict_values”对象没有属性“items”-这是由于使用Python 3。尝试在列表中包装
v
,就像在编辑器中一样。它给了我相同的错误,AttributeError:“dict_values”对象没有属性“items”…但它是一个计数器而不是dict。。这可能是问题所在吗?错误说明
lista
的类型为
dict\u values
(因此不是dict)。您得到的错误是因为您调用的
probabilitacondizionata
没有dict,但它的值作为参数,我发现它是my listathanks,但始终是同一个问题,File“C:/Users/david/prova.py”,第141行,在probabilitacondizionata{k:[v/sommafreq for v in v]for k,v in lista.items()}AttributeError:“dict_values”对象没有属性“items”,您已经将dict显示为
计数器
参数,能否以实际形式显示初始dict?请将您的dict与我的答案中的dict进行比较
{0: [0.007194244604316547, 0.03597122302158273, 0.007194244604316547, 0.007194244604316547, 0.014388489208633094, 0.07194244604316546, 0.007194244604316547, 0.014388489208633094, 0.007194244604316547, 0.014388489208633094, 0.014388489208633094, 0.007194244604316547, 0.007194244604316547], 1: [0.06474820143884892, 0.07194244604316546, 0.007194244604316547], 2: [0.03597122302158273, 0.007194244604316547, 0.007194244604316547, 0.014388489208633094, 0.007194244604316547, 0.007194244604316547, 0.06474820143884892, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.02158273381294964, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.014388489208633094, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.014388489208633094, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.07194244604316546, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.02158273381294964, 0.007194244604316547, 0.007194244604316547, 0.014388489208633094, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.02158273381294964, 0.02877697841726619, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.02158273381294964, 0.007194244604316547, 0.02877697841726619, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547, 0.007194244604316547]}
>>> raw_counts = BetterDict({'the': 1432, 'she': 600, 'wookie': 25})
>>> total = 10000.
>>> relative_freqs = raw_counts / total
>>> print(relative_freqs)
{'she': 0.06, 'the': 0.1432, 'wookie': 0.0025}