列出连接,添加以'完成的元素:'到列表,其他到子列表

时间:2015-05-30 08:06:55

标签: python list python-3.x concatenation

我需要格式化列表的输出,以便将所有以func centerOnNode(node:SKNode){ let cameraPositionInScene:CGPoint = self.convertPoint(node.position, fromNode: world!) world!.position = CGPoint(x:world!.position.x - cameraPositionInScene.x, y: world!.position.y - cameraPositionInScene.y) } override func didSimulatePhysics() { self.centerOnNode(player!) } 结尾的元素作为第一个元素,而将其余元素放在该列表的子列表中。 例如:

假设我们有:

:

到目前为止,我所做的工作将转换为以下列表:

A: B, C
B: D, F | G

但现在我不知道如何到达以下输出:

['A:', 'B,', 'C', 'B:', 'D,', ['F', 'G']]

你能帮助我吗?

编辑: 我在这里阅读文件:

[['A:',['B', 'C']], ['B:', ['D', ['F', 'G']]]

这部分是我把ors放在子列表中的地方:

file = open('data.txt', 'r')
Y = []
for line in file:
    for word in line.strip().split():
        Y.append(str(word))

2 个答案:

答案 0 :(得分:3)

为什么先拆分你的单词并将它们放在列表中?你可以直接遍历你的行并用一个嵌套的列表理解来分割它们:

import re
with open('data.txt', 'r') as f :
     [[k,[p,n.split('|')]] if '|' in n else [k,[p,n]] for k,(p,n) in [[i,j.split(',')] for i,j in [re.split(r'(?<=:) ',line) for line in f]]]

结果:

[['A:', ['B',' C']], ['B:', ['D', [' F ', ' G']]]]

但请注意,这不是一般解决方案!作为一种更通用的方式,如果你可能有一些其他分隔符而不是|例如,如果它是一个非单词字符,你用正则表达式(n分割re.split(r'\W',n)变量)。

注意r'(?<=:) '是一个positive look behind,会根据:之后的空格拆分您的行。

如果您不想使用regex拆分行,可以使用str.partition

with open('data.txt', 'r') as f :
    [[k,[p,n.split('|')]] if '|' in n else [k,[p,n]] for k,(p,n) in [[i+j,t.split(',')] for i,j,t in [line.partition(':') for line in f]]]
[['A:', [' B',' C']], ['B:', [' D', [' F ', ' G']]]]

答案 1 :(得分:2)

这看起来像是解析无上下文语法的家庭作业,|分隔扩展。所以这里有一些建议:

  1. 每条线都是左右两侧的规则。因此,分割线(您已经一次读取一行)并分别处理每一行。
  2. 每条线的左侧由扩展区分:。拆分:
  3. 右侧可以有|分隔的多个扩展。拆分并处理每一个。
  4. 扩展可以有,分隔的多个令牌。拆分它,丢弃空格,并将它们放在一个列表中。
  5. 请注意,在最后一步之前,您不需要拆分空格。它让事情变得简单得多。每个步骤使用一个for循环(步骤2除外),他们实际上会自己写。

    修改:如果最后一行真的意味着&#34; D后跟(F或G)&#34;,我误解了|和{{1}的优先级}。只是按相反的顺序拆分它们。