将清单清单转换成字典

时间:2020-05-23 17:14:17

标签: python-3.x

我在下面有一个文本文件:

A test B echo C delete
A test B echo C delete D modify
A test B echo C delete

我想解析上方的文本文件,翻译为列表列表,然后再翻译为词典

列表的预期列表为:

[['A', 'test', 'B', 'echo', 'C', 'delete'], ['A', 'test', 'B', 'echo', 'C', 'delete', 'D', 'modify'], ['A', 'test', 'B', 'echo', 'C', 'delete']]

词典的最终结果是:

[{'A':'test','B':'echo','C':'delete'},{'A':'test','B':'echo','C':'delete','D': 'modify'},{'A':'test', 'B':'echo', 'C':'delete'}]

这是我的脚本:

#!/usr/bin/python3

def listToDict(list):
    listDict = {list[i]: list[i + 1] for i in range (0, len(list), 2)}
    return listDict 

def parse_file(filepath):
    string_to_listoflist = []
    with open(filepath, 'r') as file_object:
        lines = file_object.readlines()
    for line in lines:
           string_to_listoflist.append(line.rstrip().split())

    dictionary = listToDict(string_to_listoflist)  
    print(dictionary)

if __name__ == '__main__':
    filepath = 'log.txt'
    parse_file(filepath)

使用上面的脚本将在下面产生错误:

Traceback (most recent call last):
  File "parse.py", line 19, in <module>
    parse_file(filepath)
  File "parse.py", line 14, in parse_file
    dictionary = listToDict(string_to_listoflist)
  File "parse.py", line 4, in listToDict
    listDict = {list[i]: list[i + 1] for i in range (0, len(list), 2)}
  File "parse.py", line 4, in <dictcomp>
    listDict = {list[i]: list[i + 1] for i in range (0, len(list), 2)}
TypeError: unhashable type: 'list'

现在,我在以下列表的列表中创建另一个循环:

#!/usr/bin/python3

def listToDict(list):
    listDict = {list[i]: list[i + 1] for i in range (0, len(list), 2)}
    return listDict 

def parse_file(filepath):
    string_to_listoflist = []
    dictionary           = {}
    with open(filepath, 'r') as file_object:
        lines = file_object.readlines()
    for line in lines:
           string_to_listoflist.append(line.rstrip().split())

    for e in string_to_listoflist:
        dictionary = listToDict(e)  
    print(dictionary)

if __name__ == '__main__':
    filepath = 'log.txt'
    parse_file(filepath)

即使在循环之前定义字典变量,上述脚本也会产生意外结果:

{'A': 'test', 'B': 'echo', 'C': 'delete'}

然后按如下所示更改打印命令的位置:

#!/usr/bin/python3

def listToDict(list):
    listDict = {list[i]: list[i + 1] for i in range (0, len(list), 2)}
    return listDict 

def parse_file(filepath):
    string_to_listoflist = []
    dictionary           = {}
    with open(filepath, 'r') as file_object:
        lines = file_object.readlines()
    for line in lines:
           string_to_listoflist.append(line.rstrip().split())

    for e in string_to_listoflist:
        dictionary = listToDict(e)  
        print(dictionary)

if __name__ == '__main__':
    filepath = 'log.txt'
    parse_file(filepath)

上面的脚本的意外结果是:

{'A': 'test', 'B': 'echo', 'C': 'delete'}
{'A': 'test', 'B': 'echo', 'C': 'delete', 'D': 'modify'}
{'A': 'test', 'B': 'echo', 'C': 'delete'}

任何人都可以帮助解决我的问题吗?

谢谢

2 个答案:

答案 0 :(得分:0)

首次尝试时,变量string_to_listoflist是一个列表列表。 当您将其传递给函数listToDict时,该函数将在列表的父级上进行迭代,而不是在父级列表中的每个列表上进行迭代。因此,在字典中尝试的第一个条目是

['A', 'test', 'B', 'echo', 'C', 'delete']:['A', 'test', 'B', 'echo', 'C', 'delete', 'D', 'modify']

而不是您想要的

'A':'test'

这会导致您看到TypeError: unhashable type: 'list'的错误,因为尝试将列表(可变)用作字典中的键,而字典需要不可变的键。

在父列表的每个元素周围添加额外的循环是解决此问题的正确方法。但是,如果您希望最终结果在列表中,则只需将结果附加到列表中即可。

换句话说,也许是以下

dictionaries=[]
for e in string_to_listoflist:
    dictionary = listToDict(e)  
    dictionaries.append(dictionary)

print(dictionaries)

答案 1 :(得分:0)

您可以使用re模块来获取所需的字典。

例如:

import re

with open('file.txt', 'r') as f_in:
    out = [dict(re.findall(r'([A-Z]+) ([^\s]+)', line)) for line in f_in]

print(out)

打印:

[{'A': 'test', 'B': 'echo', 'C': 'delete'}, {'A': 'test', 'B': 'echo', 'C': 'delete', 'D': 'modify'}, {'A': 'test', 'B': 'echo', 'C': 'delete'}]