将字符串行转换为字典

oknrviil  于 2021-07-13  发布在  Java
关注(0)|答案(8)|浏览(361)

我有这样一个初始代码:

record = "Jane,Doe,25/02/2002;
          James,Poe,19/03/1998;
          Max,Soe,16/12/2001
          ..."

我需要把它编成字典,它的输出应该是这样的:

{'First name': 'Jane', 'Last name': 'Doe', 'Birthday': '25/02/2002'}
{'First name': 'James', 'Last name': 'Poe', 'Birthday': '19/03/1998'}
...

每行应该有一个从1开始的递增键。
我目前还不知道如何处理这个问题,因为我还是一个没有经验的学生。
我见过有人用它来表示包含键值对的字符串,但我的字符串不包含这些:

mydict = dict((k.strip(), v.strip()) for k,v in 
              (item.split('-') for item in record.split(',')))
juzqafwq

juzqafwq1#

要为一行生成所需的词典,可以使用 split 切碎有逗号(',')的行,获取字典的值,并硬编码键。例如

line   = "Jane,Doe,25/02/2002"
values = line.split(",")
d = {"First Name": values[0], "Last Name": values[1], "Birthday": values[2]}

现在要对记录中的每一行重复这个步骤,需要一个所有行的列表。同样,你可以使用 split 在本例中,切碎有分号(';')的输入。例如

record = "Jane,Doe,25/02/2002;James,Poe,19/03/1998;Max,Soe,16/12/2001"
lines = record.split(";")

现在你可以在这上面迭代一行的解 lines 列表,将结果收集到另一个列表中。

results = []
for line in lines:
  values = line.split(",")
  results.append({"First Name": values[0], "Last Name": values[1], "Birthday": values[2]})

您提到的增量键需求似乎很奇怪,因为您可以将它们保存在一个列表中,其中列表中的索引实际上就是键。但当然,如果你真的需要索引字典的东西,你可以使用字典理解来做到这一点。

results = {i + 1: results[i] for i in range(len(results))}

最后,通过使用列表和字典理解的组合,以及您期望的键的列表,整个事情可能会变得更简洁(而且在我看来更好)。

record  = "Jane,Doe,25/02/2002;James,Poe,19/03/1998;Max,Soe,16/12/2001"
keys    = ["First Name", "Last Name", "Birthday"]
results = [dict(zip(keys, line.split(","))) for line in record.split(";")]

使用可选的索引字典:

results = {i + 1: results[i] for i in range(len(results))}
mzmfm0qo

mzmfm0qo2#

使用 split :

In [221]: record = "Jane,Doe,25/02/2002;James,Poe,19/03/1998;Max,Soe,16/12/2001"
In [223]: l = record.split(';')

In [227]: for i in l:
     ...:     l1 = i.split(',')
     ...:     d = {'First Name': l1[0], 'Last Name': l1[1], 'Birthday': l1[2]}
     ...:     ans.append(d)
     ...: 

In [228]: ans
Out[228]: 
[{'First Name': 'Jane', 'Last Name': 'Doe', 'Birthday': '25/02/2002'},
 {'First Name': 'James', 'Last Name': 'Poe', 'Birthday': '19/03/1998'},
 {'First Name': 'Max', 'Last Name': 'Soe', 'Birthday': '16/12/2001'}]
bxjv4tth

bxjv4tth3#

这应该适用于您的情况:

lines = [line.replace('\n','').replace('.','').strip() for line in record.split(';')]
desired_dict = {}
for i, line in enumerate(lines):
  words = line.split(',')
  desired_dict[i] = {
      'First name':words[0],
      'Last name':words[1],
      'Birthday':words[2]
  }
7gyucuyw

7gyucuyw4#

这个 .split() 方法是有用的。先把线分开 ; 把每根新弦 , .

record = """Jane,Doe,25/02/2002;
James,Poe,19/03/1998;
Max,Soe,16/12/2001"""
out = []
for rec in record.split(';'):
    lst = rec.strip().split(',')
    dict_new = {}
    dict_new['First Name'] = lst[0]
    dict_new['Last Name'] = lst[1]
    dict_new['Birthday'] = lst[2]
    out.append(dict_new)
print(out)
vmpqdwk3

vmpqdwk35#

其他的答案已经很清楚了,只是想补充一下,你可以在一行中完成(这是可读性差得多,不推荐,但可以说是花哨)。strip()还考虑了可能的空格,如果不需要,可以删除它们。这会给你一个你需要的字典列表

record_dict = [{'First name': val[0].strip(), 'Last name': val[1].strip(), 'Birthday': val[2].strip()} for val in (rec.strip().split(',') for rec in record.strip().split(';'))]
rqmkfv5c

rqmkfv5c6#

我想你在寻找:

record = """Jane,Doe,25/02/2002;
          James,Poe,19/03/1998;
          Max,Soe,16/12/2001"""

num = 0
out = dict()
for v in record.split(";"):
  v = v.strip().split(",")
  num += 1
  out[num] = {'First name':v[0],'Last name':v[1], 'Birthday':v[2]}
print(out)

印刷品:

{1: {'First name': 'Jane', 'Last name': 'Doe', 'Birthday': '25/02/2002'},
 2: {'First name': 'James', 'Last name': 'Poe', 'Birthday': '19/03/1998'}, 
 3: {'First name': 'Max', 'Last name': 'Soe', 'Birthday': '16/12/2001'}}
c90pui9n

c90pui9n7#


# raw string data

record = 'Jane,Doe,25/02/2002;James,Poe,19/03/1998;Max,Soe,16/12/2001'

# list of lists

list_of_lists = [x.split(',') for x in record.split(';')]

# list of dicts

list_of_dicts = []
for x in list_of_lists:
    # assemble into dict
    d = {'First name': x[0],
         'Last name': x[1],
         'Birthday': x[2]}

    # append to list
    list_of_dicts.append(d)

输出:

[{'First name': 'Jane', 'Last name': 'Doe', 'Birthday': '25/02/2002'},
 {'First name': 'James', 'Last name': 'Poe', 'Birthday': '19/03/1998'},
 {'First name': 'Max', 'Last name': 'Soe', 'Birthday': '16/12/2001'}]
3xiyfsfu

3xiyfsfu8#

下面是一个循序渐进的python方法:

>>> from pprint import pprint # just to have a fancy print
>>> columns = ['First name', 'Last name', 'Birthday']
>>> records = '''Jane,Doe,25/02/2002
...           James,Poe,19/03/1998
...           Max,Soe,16/12/2001'''

>>> records = records.split()
>>> pprint(records)
['Jane,Doe,25/02/2002',
 'James,Poe,19/03/1998',
 'Max,Soe,16/12/2001']

>>> records = [_.split(',') for _ in records]
>>> pprint(records)
[['Jane', 'Doe', '25/02/2002'],
 ['James', 'Poe', '19/03/1998'],
 ['Max', 'Soe', '16/12/2001']]

>>> records = [dict(zip(columns, _)) for _ in records]
>>> pprint(records)
[{'First name': 'Jane', 'Last name': 'Doe', 'Birthday': '25/02/2002'},
 {'First name': 'James', 'Last name': 'Poe', 'Birthday': '19/03/1998'},
 {'First name': 'Max', 'Last name': 'Soe', 'Birthday': '16/12/2001'}]

如果所有记录都在一行中,由 ; 信号,然后你可以这样做:

>>> from pprint import pprint # just to have a fancy print
>>> columns = ['First name', 'Last name', 'Birthday']
>>> records = 'Jane,Doe,25/02/2002;James,Poe,19/03/1998;Max,Soe,16/12/2001'

>>> records = records.split(';')
>>> pprint(records)
['Jane,Doe,25/02/2002',
 'James,Poe,19/03/1998',
 'Max,Soe,16/12/2001']

>>> records = [_.split(',') for _ in records]
>>> pprint(records)
[['Jane', 'Doe', '25/02/2002'],
 ['James', 'Poe', '19/03/1998'],
 ['Max', 'Soe', '16/12/2001']]

>>> records = [dict(zip(columns, _)) for _ in records]
>>> pprint(records)
[{'First name': 'Jane', 'Last name': 'Doe', 'Birthday': '25/02/2002'},
 {'First name': 'James', 'Last name': 'Poe', 'Birthday': '19/03/1998'},
 {'First name': 'Max', 'Last name': 'Soe', 'Birthday': '16/12/2001'}]

最后你可以把它们放在一行:

>>> from pprint import pprint # just to have a fancy print
>>> columns = ['First name', 'Last name', 'Birthday']
>>> records = 'Jane,Doe,25/02/2002;James,Poe,19/03/1998;Max,Soe,16/12/2001'

>>> # All tasks in one line now
>>> records = [dict(zip(columns, _)) for _ in [_.split(',') for _ in records.split(';')]]

>>> pprint(records)
[{'First name': 'Jane', 'Last name': 'Doe', 'Birthday': '25/02/2002'},
 {'First name': 'James', 'Last name': 'Poe', 'Birthday': '19/03/1998'},
 {'First name': 'Max', 'Last name': 'Soe', 'Birthday': '16/12/2001'}]

相关问题