【问题标题】:how to convert list to dictionary form?如何将列表转换为字典形式?
【发布时间】:2020-04-05 12:36:10
【问题描述】:
dic_list = [{'a': '123456789',
             'b': '',
             'c': '1',
             'd': '',
             'e': '',
             'f': '',
             'e': '',
             'g': '',
             'h': '',
             'Total': '1'}, {'a': '123456710',
             'b': '',
             'c': '1',
             'd': '',
             'e': '',
             'f': '',
             'e': '',
             'g': '',
             'h': '',
             'Total': '1'}, ...]

我想把上面的字典做成下面的字典形式。有很多字典,不只是上面的一个。实际上,当我写“type(dict_list)”时,它说的是列表。我不知道为什么它说列表。我也想得到“皮尔逊相关系数”。

dic_list = {'123456789': {
  'b': '',
  'c': 1,
  'd': '',
  'e': '',
  'f': '',
  'g': '',
  'h': '',
  'i': '',
  'Total': '1',},
{'123456710': {
  'b': '',
  'c': 1,
  'd': '',
  'e': '',
  'f': '',
  'g': '',
  'h': '',
  'i': '',
  'Total': '1',}....,

【问题讨论】:

  • 所有带有 [ ] 的东西都是一个列表。这是一个包含多个字典的列表。如果您需要有序字典(因为您标记了它,在上下文中不确定您为什么需要它)。你可能想看看 collections.OrderedDict:docs.python.org/2/library/collections.html
  • 从第一个字典列表移动到建议输出的逻辑是什么?
  • 您能更广泛地解释一下您要做什么吗?正如你在这里写的,这个问题不清楚。
  • type(dict_list) 返回列表,因为它实际上是 list 而不是 dict

标签: python list dictionary jupyter-notebook ordereddictionary


【解决方案1】:

如果您确定dic_list 内每个字典中a 中的所有值都是唯一的,则可以使用如下的dict理解

>>> from copy import deepcopy
>>> customer = {x.pop('a'):x for x in deepcopy(dic_list)}
>>> print(customer)

{'123456789': {'b': '', 'c': '1', 'd': '', 'e': '', 'f': '', 'g': '', 'h': '', 'Total': '1'}, 
'123456710': {'b': '', 'c': '1', 'd': '', 'e': '', 'f': '', 'g': '', 'h': '', 'Total': '1'}}

如果您不进行深拷贝,您的原始列表将被修改

编辑:皮尔逊相关

import math

def isfloat(value):
    try:
        float(value)
        return True
    except ValueError:
        return False

def sim_pearson(data, name1, name2):
    X = [v for k,v in data.get(name1).items() if k in data.get(name2).keys()]
    Y = [v for k,v in data.get(name2).items() if k in data.get(name1).keys()]

    # convert string to float if convertable, else replace with zero
    X = [float(i) if isfloat(i) else 0 for i in X]
    Y = [float(i) if isfloat(i) else 0 for i in Y]

    count = len(X)
    sumX = sum(X)
    sumY = sum(Y)
    sumPowX = sum([i**2 for i in X])
    sumPowy = sum([i**2 for i in Y])
    sumXY = sum([i*j for i,j in zip(X,Y)])
    return ( sumXY- ((sumX*sumY)/count) )/ math.sqrt( (sumPowX - (pow(sumX,2) / count)) * (sumPowy - (pow(sumY,2)/count)))

sim_pearson(customer,'123456789','123456710')
# here 'customer' is the dictionary you have created earlier

您可以使用scipy.stats.pearsonr 计算皮尔逊相关系数

【讨论】:

  • 谢谢,还有 1 个问题。我想得到皮尔逊相关系数。所以当我输入下面的代码时,我不起作用。你能告诉我为什么吗? (它说关键错误:“123456789”,客户是我的 csv 文件名)
  • def sim_pearson(data, name1, name2): sumX=0 sumY=0 sumPowX=0 sumPowY=0 sumXY=0 count=0 for i in data[name1]: if i in data[name2 ]: sumX+=data[name1][i] sumY+=data[name2][i] sumPowX+=pow(data[name1][i],2) sumPowY+=pow(data[name2][i],2) sumXY+= data[name1][i]*data[name2][i] count+=1 返回 ( sumXY- ((sumX*sumY)/count) )/ sqrt( (sumPowX - (pow(sumX,2) / count)) * (sumPowY - (pow(sumY,2)/count))) sim_pearson(customer,'123456789','123456710')
  • 字典中的值可能是字符串,而不是整数或浮点数
  • 它说“无类型”对象没有属性“项目”。你知道为什么吗?
  • 你的 data 是函数 sim_pearson(data, name1, name2) ,是空白的,因此 NoneType
【解决方案2】:

使用 Python3.6 和字典理解

dic_list = {i['a']: {j: k for j, k in i.items() if j!='a'} for i in dic_list}

【讨论】:

    【解决方案3】:

    据我所知,这应该可行。测试一下,然后告诉我。

    big_dict = {}
    for i in dic_list:
        k = i['a']
        del i['a']
        big_dict[k] = dict(i) 
    print(big_dict)
    

    【讨论】:

    • 它就像 {'123456789': OrderedDict(['b', ''), ('c', '1'), ('d', ' '), ('e' , ' '), ('f', ' '), ('e', ' '), ('g', ' '), ('h', ' '), ('Total', '1') ]), '123456710' : OrderedDict([( ......我问的有点不同..我的电脑内存无法运行这段代码TT这是我的电脑第一次像这样工作跨度>
    猜你喜欢
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2010-11-02
    相关资源
    最近更新 更多