Добавить группу содержимого в текстовом файле в список по ключевому слову - PullRequest
0 голосов
/ 08 марта 2020

У меня есть текстовый файл со следующим содержанием, и как я могу сгруппировать каждую строку в независимый список? ( Отредактировано ~ Добавить каждую группу строк в независимый список, например, список группы A и список группы B)

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

Пока что я могу добавлять каждую строку в виде списка слов в список, но не имею ни малейшего понятия, чтобы автоматизировать c группирование их по группам.

Благодарю, если кто-нибудь может посоветовать.

Ответы [ 2 ]

0 голосов
/ 08 марта 2020

Вы можете попробовать группировать серии, если у вас есть гибкость pandas

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

Out:

1    [[John, 25, USA], [Ali, 20, Indonesia], [Chris...
2     [[Chris, 30, Australia], [ZhangMing, 20, China]]
dtype: object
0 голосов
/ 08 марта 2020

Способ группировать таким образом состоит в том, чтобы поддерживать два списка, внешний список для всех групп и внутренний список для отдельных групп. Каждый раз, когда группа собирается, и группа к «внешнему» списку и начинает новый список группы.

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) 
...