Python:在文本文件中,如何根据模式对先前重复的行进行分组?

时间:2019-01-29 17:12:36

标签: python

我有这个文本文件-任务,然后是括号之间的标签-:

Buy a new tablet (@urgent, @finance, @internet)
Pay my rent (@home, @finance, @urgent, @important)
Watch TV (@home, @internet)
Do some exercise (@health, @important) 

我如何在Python中获得此文本文件的以下视图:

 @finance
    Buy a new tablet 
    Pay my rent 

 @health
    Do some exercise

@home
    Pay my rent
    Watch TV 

@important
    Pay my rent 
    Do some exercise 

@internet
    Buy a new tablet 
    Watch TV 

@urgent
    Pay my rent

我根本不知道如何进行(顺便说一句,这不是家庭作业)。关于删除重复的行有无数的主题,但是我找不到检查此特定问题的主题。

预先感谢

2 个答案:

答案 0 :(得分:1)

您要使用每行的第一个单词作为字典的键,并将字典中的关联值设为列表,以便可以将其追加到列表中。没有任何多余的装饰,并且警告未经测试的代码:

mydict = {}

for line in file:
    key = line.split(' ')[0]
    if key not in mydict:
         mydict[key] = [ line ]
    else:
         mydict[key].append(line)

for key, value in mydict.items() :
     print(key)
     for line in value:
          print( '    ' + line )
     print(' ')

有很多方法可以使它变得更短,并且可以说更像Python。我以我认为最简单的方式编写了它,而无需使用任何“附加”,例如使用香草{}而不是collections中的任何内容。

注意-问题已更改,没有时间重写此答案。看评论。我希望这对某些人有用。

答案 1 :(得分:1)

这可能不是最有效的方法,但效果很好:

lst = []
with open('filename.txt', 'r') as f:
    for line in f:
        mid = line.split('(')
        all_ats = mid[1][:-1].split(', ')
        lst.append((mid[0].strip(), all_ats))

vals = sorted(set(y for x in lst for y in x[1]))

for x in vals:
    print(x)
    for y, z in lst:
        if x in z:
            print(f'\t{y}')

'''
@finance
    Buy a new tablet
    Pay my rent
@health
    Do some exercise
@home
    Pay my rent
    Watch TV
@important
    Pay my rent
    Do some exercise
@internet
    Buy a new tablet
    Watch TV
@urgent
    Buy a new tablet
    Pay my rent
'''