我正在努力拆分我的数据文件中的行。以下是几行示例:
1:0 2:120
1:1 2:131
1:2 2:26
1:3 2:568
1:4 2:176
1:5 2:28 3:549
1:6 2:17
1:7 2:6 3:217 4:401 5:636
1:8 2:139
我想拆分它以获取每个值...可能是数组的形式:
((1, 2) , (0, 120))
((1, 2) , (1, 131))
...
((1, 2, 3, 4, 5) , (7, 6, 217, 401, 636))
意味着对于每一行,数组可以具有不同的维度。 我试图分两步拆分它,但它不起作用。
inf = open("datafile.txt", 'r')
for line in inf:
line.split()
for x in line.split():
x.split(':',1)
答案 0 :(得分:3)
您可以使用zip
函数对两个列表的元素进行分组。
with open("Input.txt") as inf:
for line in inf:
print zip(*map(lambda x: map(int, x.split(":")), line.split()))
<强>输出强>
[(1, 2), (0, 120)]
[(1, 2), (1, 131)]
[(1, 2), (2, 26)]
[(1, 2), (3, 568)]
[(1, 2), (4, 176)]
[(1, 2, 3), (5, 28, 549)]
[(1, 2), (6, 17)]
[(1, 2, 3, 4, 5), (7, 6, 217, 401, 636)]
[(1, 2), (8, 139)]
建议:
使用with
关键字打开文件总是很好,就像我在上面的代码中所示。因为,它将负责关闭/释放资源,即使程序因异常而失败。
<强>解释强>
由于zip
是函数调用,因此首先计算参数。让我们稍后来*
。 map(lambda x: map(int, x.split(":")), line.split())
,我们将lambda函数lambda x: map(int, x.split(":"))
应用于line.split()
返回的字符串列表中的每个元素(将空格字符分割为句子并返回列表)。
每个拆分字将作为参数逐个传递给lambda函数。如果我们采用第一种情况,第一个"1:0"
将作为x
发送到lambda函数,我们根据:
进行拆分,这将给出一个列表["1", "0"]
,然后我们对此应用int
函数,这将给[1, 0]
。因此,在分割所有行并应用lambda之后,结果将如下所示
[[1, 0], [2, 120]]
[[1, 1], [2, 131]]
[[1, 2], [2, 26]]
[[1, 3], [2, 568]]
[[1, 4], [2, 176]]
[[1, 5], [2, 28], [3, 549]]
[[1, 6], [2, 17]]
[[1, 7], [2, 6], [3, 217], [4, 401], [5, 636]]
[[1, 8], [2, 139]]
现在我们在每个列表中都有两个元素。记住我们后来决定讨论的*
,它会解压缩列表并将所有元素作为参数传递给zip
函数,就像这样
zip([1, 0], [2, 120])
现在zip
将选择所有第一个元素并将它们放入列表中,然后它将选择所有第二个元素并将它们放入列表中,依此类推。
这就是我们如何得到您期望的答案。