Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从文本文件的行中剥离字符串,并将列读入以列表作为值的字典_Python_Python 3.x_Dictionary_File Io - Fatal编程技术网

Python 从文本文件的行中剥离字符串,并将列读入以列表作为值的字典

Python 从文本文件的行中剥离字符串,并将列读入以列表作为值的字典,python,python-3.x,dictionary,file-io,Python,Python 3.x,Dictionary,File Io,我一直在努力使输入文件的格式适合我的算法 我要读取此文本文件: 1 -> 7,8 11 -> 1,19 219 -> 1,9,8 在本词典中: { 1: [7, 8], 11: [1, 19], 219: [1, 9, 8]} 我尝试过以下代码: with open("file.txt", "r+") as f: f.write(f.read().replace("->", " ")) f.close() d = {} with open("file

我一直在努力使输入文件的格式适合我的算法

我要读取此文本文件:

1 -> 7,8
11 -> 1,19
219 -> 1,9,8
在本词典中:

{ 1: [7, 8], 11: [1, 19], 219: [1, 9, 8]}
我尝试过以下代码:

with open("file.txt", "r+") as f:
    f.write(f.read().replace("->", " "))
    f.close()

d = {}
with open("file.txt") as file:
    for line in file:
        (key, val) = line.split()
        d[key] = val

但是在这段代码中,第二列中有两个以上的参数这一事实让它陷入了困境。如何从第二列中的元素中创建一个列表,并将该列表用作每个键的值?

无需执行该预处理步骤即可删除
'->'
。只需使用:

d = {}
with open("file.txt") as file:
    for line in file:
        left,right = line.split('->')
        d[int(left)] = [int(v) for v in right.split(',')]
您甚至可以使用字典理解,使其成为一行:

with open("file.txt") as file:
    d = {int(left) : [int(v) for v in right.split(',')]
             for left,right in (line.split('->') for line in file)
        }
这使得:

>>> d
{1: [7, 8], 11: [1, 19], 219: [1, 9, 8]}

无需执行该预处理步骤即可删除
'->'
。只需使用:

d = {}
with open("file.txt") as file:
    for line in file:
        left,right = line.split('->')
        d[int(left)] = [int(v) for v in right.split(',')]
您甚至可以使用字典理解,使其成为一行:

with open("file.txt") as file:
    d = {int(left) : [int(v) for v in right.split(',')]
             for left,right in (line.split('->') for line in file)
        }
这使得:

>>> d
{1: [7, 8], 11: [1, 19], 219: [1, 9, 8]}

使用
str.split
在字典中嵌套生成器表达式,将键转换为整数并将值映射为整数:

with open('file.txt') as f:
    result = {int(k):list(map(int, v.split(','))) for k,v in (line.split(' -> ') for line in f)}

使用
str.split
在字典中嵌套生成器表达式,将键转换为整数并将值映射为整数:

with open('file.txt') as f:
    result = {int(k):list(map(int, v.split(','))) for k,v in (line.split(' -> ') for line in f)}

你为什么要使用
f.write(…)
等?你为什么要使用
f.write(…)
等?@MosesKoledoye:是的,同时写两个答案不是一个好主意。有人可能会说
[int(v)for v in right.split(',')]
列表(map(int,right.split(','))更像pythonic
@WillemVanOnsem:我在上面两个代码中都得到了一个ValueError:第27行,在左,右=行。拆分('->')ValueError:没有足够的值来解包(预期为2,得到1)编辑:可能是因为文件中有些行的键只有一个值。@DavidK11:但您可能已经用自己编写的算法重写了文件。您需要删除您自己插入的行:只允许使用带有箭头的行。@WillemVanOnsem:我通过重新复制原始文件仔细检查了这是否是问题所在。但我认为问题在于文件中有些行的键只有一个值。@MosesKoledoye:是的,同时编写两个答案不是一个好主意。.有人可能会说,
[int(v)for v in right.split(',')]
list(map(int,right.split(','))更像python
@WillemVanOnsem:我在上面两个代码中都得到了一个ValueError:第27行,在左,右=行。拆分('->')ValueError:没有足够的值来解包(预期为2,得到1)编辑:可能是因为文件中有些行的键只有一个值。@DavidK11:但您可能已经用自己编写的算法重写了文件。您需要删除您自己插入的行:只允许使用带有箭头的行。@WillemVanOnsem:我通过重新复制原始文件仔细检查了这是否是问题所在。但我认为问题在于,文件中有些行的键只有一个值。
v
是一个字符串:
'1,9,8'
<代码>列表(map(int,'1,9,8'))将崩溃…:它将在字符上迭代,因此只解析1位数字,并在逗号上崩溃。@WillemVanOnsem-抱歉,没有注意到逗号;已修复。@TigerhawkT3您还可以使用
list(ast.literal\u eval(v))
获取整数列表
v
是一个字符串:
'1,9,8'
<代码>列表(map(int,'1,9,8'))将崩溃…:它将在字符上迭代,因此只解析1位数字,并在逗号上崩溃。@WillemVanOnsem-抱歉,没有注意到逗号;修复。@TigerhawkT3您还可以使用
list(ast.literal\u eval(v))
获得整数列表。