【问题标题】:Append a group of content in text file to a list by keyword按关键字将文本文件中的一组内容附加到列表中
【发布时间】:2020-03-08 08:36:40
【问题描述】:

我有一个包含以下内容的文本文件,如何将每一行分组到一个独立的列表中? (已编辑~将每组行追加到一个独立的列表中,例如groupA列表和groupB列表)

Group A
John 25 USA
Ali 20 Indonesia
Christina 30 India
.
.
Group B
Chris 30 Australia
ZhangMing 20 China
.
.
.

输出应该是这样的

print groupA
# output
[['john','25','USA'], ['Ali','20','Indonesia'], ['Christina','30','India']]

print groupB
# output
[['Chris','30','Australia'], ['ZhangMing', '20','China']]

到目前为止,我能够将每一行作为单词列表附加到列表中,但不知道根据 Group 自动对它们进行分组。

如果有人可以提供建议,不胜感激。

【问题讨论】:

  • 文件中是否有带有. 字面意思的行,或者您是否使用它们来缩写?
  • 这意味着“更多”行,很抱歉造成混淆

标签: python list python-2.7


【解决方案1】:

如果你有 pandas 的灵活性,你可以尝试系列分组

text = pd.Series(text.splitlines())
text.groupby(text.str.contains('Group').cumsum()).apply(lambda x: x.str.split(' ').tolist()[1:])

输出:

1    [[John, 25, USA], [Ali, 20, Indonesia], [Chris...
2     [[Chris, 30, Australia], [ZhangMing, 20, China]]
dtype: object

【讨论】:

    【解决方案2】:

    这样分组的方法是维护两个列表,一个用于所有组的外部列表,一个用于各个组的内部列表。每次收集一个组,并将该组移到“外部”列表并开始一个新的组列表。

    with open('groups.txt') as f:
        groups = []
        group = []
        for line in f:
            if line == '.\n':
                continue
            if line.startswith('Group'):
                if group:
                    groups.append(group)
                    group = []
                group.append(line.strip())
            else:
                group.append(line.strip().split())
    
        # Collect the final group, if there is one
        if group:
            groups.append(group)
    
    print(groups)
    

    结果:

    [['Group A', ['John', '25', 'USA'], ['Ali', '20', 'Indonesia'], ['Christina', '30', 'India']],
     ['Group B', ['Chris', '30', 'Australia'], ['ZhangMing', '20', 'China']]]
    

    根据更改的问题进行编辑:

    在全局命名空间中创建新变量是可能的,但通常不是一个好主意(无法判断 Group_A 是错误还是从某些数据中变出)。最好的方法是创建一个容器(列表或 dict)来保存值,并在容器中访问它们。

    此示例使用defaultdict 来保存生成的列表。

    from collections import defaultdict                                                                                                                                              
    
    
    with open('groups.txt') as f:                                                                                                                                                    
        groups = defaultdict(list)                                                                                                                                                   
        group = []                                                                                                                                                                   
        for line in f:                                                                                                                                                               
            if line == '.\n':                                                                                                                                                        
                continue                                                                                                                                                             
            if line.startswith('Group'):                                                                                                                                             
                key = line.strip()                                                                                                                                                   
            else:                                                                                                                                                                    
                groups[key].append(line.strip().split())                                                                                                                             
    
    print(groups) 
    

    【讨论】:

    • 感谢您的回答,但我希望将每个组列在一个列表中,例如 A 组列表和 B 组列表,我已经编辑了我的问题,为混淆道歉
    • 我已根据您的评论修改了我的答案;如果这是您想要的,请发表评论,我会以重复的形式关闭问题 - 这里经常被问到
    • 我应该如何访问值列表中的单个值?比方说,要评估约翰是否在美国的 A 组,然后做点什么?
    猜你喜欢
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 2019-05-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多