列表连接,将以“:”结尾的元素添加到列表中,将其他元素添加到子列表中

Posted

技术标签:

【中文标题】列表连接,将以“:”结尾的元素添加到列表中,将其他元素添加到子列表中【英文标题】:List Concatenation, Adding elements that finish with ':' to a list, and others to a sublist 【发布时间】:2015-08-13 03:52:41 【问题描述】:

我需要格式化列表的输出,以便将所有以: 结尾的元素作为第一个元素,而其余元素则在该列表的子列表中。 例如:

假设我们有:

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

到目前为止,我所做的改变了以下列表中的内容:

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

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

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

你能帮帮我吗?

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

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

这部分是我将 ors 放入子列表的地方:

text = []
i = 0
while True:
    if i > len(Y)-2:
        # No more possible |'s, so wrap things up
        text.append( Y[-1] )
        break
    if Y[i+1] == '|':
        # Add the items around the |; move past the group:
        if Y[i+2].endswith(','):
            Y[i+2] = Y[i+2].replace(",", "")
            text.append([Y[i], Y[i+2]])
        else:
            text.append([Y[i], Y[i+2]])
        i += 3
    else:
        # Add the current element & move on
        text.append( Y[i] )
        i += 1
for id in range(len(text)-1):
    if type(text[id]) != str:
        if text[id][-1] == text[id+1]:
            text.remove(text[id+1])

【问题讨论】:

你有什么输入?字符串还是字典? 你输入的格式是什么? 输入(A,B..)取自文件,然后我将所有内容作为字符串放入列表中 【参考方案1】:

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

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']]]]

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

注意r'(?&lt;=:) ' 是一个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']]]]

【讨论】:

我不能使用外部模块...只是基本的python操作无论如何感谢您的帮助! 我收到以下错误:NameError: name 's' is not defined,但我会尝试找出原因! :) @Bioshock 抱歉,上次尝试时它仍然存在,请查看编辑! ;) 我花了 2 天时间试图弄清楚这一点。我还是个新手!我真的很感激! (对不起我的英语) 我刚刚意识到,在您的输出中,第一个子列表中有一个小错误:['A:', [' B', [' C']]],实际上它创建了一个包含C 的新子列表,而我需要以下内容:@987654335 @ 因为没有。有办法解决吗?【参考方案2】:

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

    每一行都是一个左右两边的规则。因此,拆分行(您已经一次读取一行)并分别处理每一行。 每一行都有一个左侧,由: 与扩展分开。拆分:。 右侧可以有多个由| 分隔的扩展。拆分并处理每一个。 一个扩展可以有多个以, 分隔的标记。在此拆分,丢弃空格,并将它们放入列表中。

请注意,在最后一步之前,您不需要拆分空格。它使事情变得简单得多。每个步骤都使用一个 for 循环(步骤 2 除外),它们实际上会自己编写。

编辑:如果最后一行真的表示“D 后跟(F 或 G)”,我误解了 |, 的优先级。只需按相反的顺序拆分它们即可。

【讨论】:

我会努力实现的!我会告诉你结果的!

以上是关于列表连接,将以“:”结尾的元素添加到列表中,将其他元素添加到子列表中的主要内容,如果未能解决你的问题,请参考以下文章

2020-2-21

数据结构

用值替换列表中的元素,以新列表结尾

按索引在 la 列表中插入一个元素而不移动其他元素

python (001)----列表

manuals学习之第六课时