Python 使用for循环创建嵌套字典

Python 使用for循环创建嵌套字典,python,python-3.x,csv,dictionary,Python,Python 3.x,Csv,Dictionary,我有一个csv文件,正在尝试创建一个嵌套字典,如下所示: contacts = {"Tom": {"name": "Tom Techie", "phone": "123 123546", "email": "tom@tom.fi", "skype": "skypenick"}, "Mike": {"name": "Mike Mechanic",

我有一个csv文件,正在尝试创建一个嵌套字典,如下所示:

contacts = {"Tom": {"name": "Tom Techie",
                    "phone": "123 123546",
                    "email": "tom@tom.fi",
                    "skype": "skypenick"},

            "Mike": {"name": "Mike Mechanic",
                     "phone": "000 123546",
                     "email": "mike@mike.fi",
                     "skype": "-Mike-M-"}}
def line_to_dict(x, d):
  x = x.split(";")
  d[x[0]] = {
      "name": x[2], 
      "phone": x[3],
      "email": x[1], 
      "skype": x[4][:-1] # Slice off trailing newline
  }

with open("df.csv", "r") as file:
  d = {}
  for x in file:
    line_to_dict(x, d)
  d.pop("")

这就是我写的:

file = open("csv","r")
d = {}
for i in file:

    f = i.strip()
    x = f.split(";")

    if x[4] != "":
        d.update({x[0] : {"name":x[1],
                      "phone":x[2],
                      "email":x[3],
                      "skype":x[4]}})

    else:
        d.update ({x[0] : {"name": x[1],
                       "phone": x[2],
                       "email": x[3]}})
然而,它将dict作为一个普通的字典打印,当更新应该像上面所说的那样时,它将更新作为键

编辑: csv的第一行:

key;name;phone;email;skype
Tom;Tom Techie;123 123546;tom@tom.fi;skypenick
Mike;Mike Mechanic;000 123456;mike@mike.fi;-Mike-M-
Archie;Archie Architect;050 987654;archie@archie

您可以使用
pd.read\u csv()
来编辑()

收益率:

{'Tom': {'name': 'Tom Techie', 'phone': '123 123546', 'email': 'tom@tom.fi', 'skype': 'skypenick'}, 'Mike': {'name': 'Mike Mechanic', 'phone': '000 123456', 'email': 'mike@mike.fi', 'skype': '-Mike-M-'}, 'Archie': {'name': 'Archie Architect', 'phone': '050 987654', 'email': 'archie@archie', 'skype': nan}}
您可以使用以下方法来实现您的目标:

file = """key;name;phone;email;skype
Tom;Tom Techie;123 123546;tom@tom.fi;skypenick
Mike;Mike Mechanic;000 123456;mike@mike.fi;-Mike-M-
Archie;Archie Architect;050 987654;archie@archie""".splitlines()

d = {}
h = None
for i in file: # works the same for your csv-file
    # first row == header, store in h
    if h is None:
        h = i.strip().split(";")[1:]
        continue # done for first row

    x = i.strip().split(";")

    # zip pairs the read in line with the header line to get tuples
    # wich are fed into the dict constructor that creates the inner dict
    d[x[0]] = dict(zip(h,x[1:]+[""])) # no default for skype

    # use this instead if you want the skype key always present with empty default
    # d[x[0]] = dict(zip(h,x[1:]+[""]))  

print(d)
丢弃较长列表中的元素-不需要对此进行任何检查

输出:

{'Tom':   {'name': 'Tom Techie', 'phone': '123 123546', 
           'email': 'tom@tom.fi', 'skype': 'skypenick'}, 
 'Mike':   {'name': 'Mike Mechanic', 'phone': '000 123456', 
            'email': 'mike@mike.fi', 'skype': '-Mike-M-'}, 
 'Archie': {'name': 'Archie Architect', 'phone': '050 987654', 
            'email': 'archie@archie'}}
{'Archie': {'email': 'archie@archie',
            'name': 'Archie Architect',
            'phone': '050 987654',
            'skype': None},
 'Mike': {'email': 'mike@mike.fi',
          'name': 'Mike Mechanic',
          'phone': '000 123456',
          'skype': '-Mike-M-'},
 'Tom': {'email': 'tom@tom.fi',
         'name': 'Tom Techie',
         'phone': '123 123546',
         'skype': 'skypenick'}}

如果您使用注释行,数据将获得skype的默认值
'
-仅适用于b/c skype是分割行的最后一个元素

您可以使用dict!假设数据是

with open("df.csv", "r") as file:
  d = {x.split(";")[0]:{
      "name": x.split(";")[2], 
      "phone": x.split(";")[3],
      "email": x.split(";")[1], 
      "skype": x.split(";")[4][:-1] # Slice off trailing newline
  } for x in file}
  d.pop("")
我们希望尽可能使用
打开文件,以从Python的上下文管理中获益。有关
with
语句的基本理解,请参阅

由于键
只在csv的开头出现一次,因此我们可以在末尾弹出它,避免在每次迭代时执行比较。口述理解完成了你想通过
d.update
实现的相同目标

更多关于理解:

编辑:重构以删除对
的重复调用。拆分可以如下所示:

contacts = {"Tom": {"name": "Tom Techie",
                    "phone": "123 123546",
                    "email": "tom@tom.fi",
                    "skype": "skypenick"},

            "Mike": {"name": "Mike Mechanic",
                     "phone": "000 123546",
                     "email": "mike@mike.fi",
                     "skype": "-Mike-M-"}}
def line_to_dict(x, d):
  x = x.split(";")
  d[x[0]] = {
      "name": x[2], 
      "phone": x[3],
      "email": x[1], 
      "skype": x[4][:-1] # Slice off trailing newline
  }

with open("df.csv", "r") as file:
  d = {}
  for x in file:
    line_to_dict(x, d)
  d.pop("")

我喜欢熊猫的回答,但如果你不想要第三方库,请使用内置的
csv
模块:

import csv
from pprint import pprint

D = {}
with open('csv',newline='') as f:
    r = csv.DictReader(f,delimiter=';')
    for line in r:
        name = line['key']
        del line['key']
        D[name] = dict(line)

pprint(D)
输出:

{'Tom':   {'name': 'Tom Techie', 'phone': '123 123546', 
           'email': 'tom@tom.fi', 'skype': 'skypenick'}, 
 'Mike':   {'name': 'Mike Mechanic', 'phone': '000 123456', 
            'email': 'mike@mike.fi', 'skype': '-Mike-M-'}, 
 'Archie': {'name': 'Archie Architect', 'phone': '050 987654', 
            'email': 'archie@archie'}}
{'Archie': {'email': 'archie@archie',
            'name': 'Archie Architect',
            'phone': '050 987654',
            'skype': None},
 'Mike': {'email': 'mike@mike.fi',
          'name': 'Mike Mechanic',
          'phone': '000 123456',
          'skype': '-Mike-M-'},
 'Tom': {'email': 'tom@tom.fi',
         'name': 'Tom Techie',
         'phone': '123 123546',
         'skype': 'skypenick'}}

你的问题没有足够的信息a)运行代码,b)重现问题,c)帮助你。你至少应该提供csv文件的前几行,编辑简历的前几行,以打开帖子