数据文件中的分割线

用户名

我正在为数据文件中的分割线而苦苦挣扎。这是几行示例:

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)
四人

您可以使用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"将其发送给lambda函数as x,在该函数中我们根据进行拆分,:从而给出一个列表["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将选择所有第一个元素并将它们放在列表中,然后将选择所有第二个元素并将它们放在列表中,依此类推。

这就是我们如何获得您期望的答案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章