1

我正在尝试使用以这种格式排列的文件构建两个单独的字典:

我需要把名字倒过来,所以名字然后姓氏,对于第一个字典,我需要把名字作为键,把第一个块中的其他名字作为值,即字符串列表。

第二个字典我需要再次使用名字作为键,将它们所属的组或组作为值。

我已经想出了如何使用逗号反转名称来拆分它们,但是我最终得到了所有名称的列表,这些名称实际上根本无法帮助我将它们分开。

我真的很困惑如何迭代它以提取这些特定行,然后将它们作为键与其他特定行作为值相关联。特别困惑我如何将名字作为键,然后将以下名称作为值,然后跳过空白行并重新开始,但使用新键。

文本文件格式:

没有项目符号的文本文件的格式完全像这样,如果只包含第一个块,则所需的输出 diciotanries 将如下所示:

Person_to_friends = {'Leah Connors' : ['Frank Connors', 'Shawn Patterson', 'John Patterson']} 
Persons_to_networks = {'Leah Connors' : ['Flying Club']}

当我尝试测试您的代码时,我收到了一个索引错误

  • 康纳斯,利亚
  • 飞行俱乐部
  • 康纳斯,弗兰克
  • 帕特森,肖恩
  • 帕特森,约翰

  • 科斯莫,卡尔文

  • 帆船小伙伴
  • 闪避球组
  • 帕特森,肖恩
  • 帕特森,莎莉

  • 康纳斯,弗兰克

  • 赛艇学校
  • 康纳斯,利亚
  • 康纳斯,罗伯特

Cosmo, Calvin应该是第二个块的Connors, Frank一部分和第三个块的一部分,块之间有一个空格。有些东西不工作。我不知道为什么它一直在创造一个空间。

这是我到目前为止所拥有的,但我认为我真的很遥远..请帮助

def load_profiles(profiles_file, person_to_friends, person_to_networks):
f = open('profiles.txt')
lines = f.readlines()
new = []
line_number = 0
while line_number < len(lines)+1:
    prev_line = lines[line_number-1]
    line = lines[line_number]
    from_line = lines[line_number+1]
    if ',' in line and ',' not in from_line and from_line.isspace() == False:
        key = reverse_name(line)
    elif ',' not in line and line.isspace()==False:
        new.append(line.strip('\n'))
        try:
            person_to_networks[key].append(new)
        except KeyError:
            person_to_networks[key] = [new]            
    elif  line.isspace()== True:
        line_number = from_line
            line_number += 1
4

1 回答 1

2
import itertools
import collections

person_to_networks = collections.defaultdict(set)
person_to_friends = collections.defaultdict(set)

def format_name(name):
    return name.split(',')[1][1:] + ' ' + name.split(',')[0]

with open('exampletext') as f:
    #cheap hack so that we detect the need for a new leader on the first line
    lines = [''] + [line.strip() for line in f]

for line in lines:
    if line == '': 
        new_leader = True
    else:
        if new_leader:
            leader = format_name(line)
            new_leader = False
        else:
            if ',' in line:
                person_to_friends[leader].add(format_name(line))
            else:
                person_to_networks[leader].add(line)

print 'Person to Networks'
for p in person_to_networks:
    print '%s: %r' % (p, [e for e in person_to_networks[p]])

print '\nPerson to Friends'
for p in person_to_friends:
    print '%s: %r' % (p, [e for e in person_to_friends[p]])

输出:

Person to Networks
Frank Connors: ['Rowing school']
Calvin Cosmo: ['Sailing buddies', 'Dodge ball group']
Leah Connors: ['Flying Club']

Person to Friends
Frank Connors: ['Robert Connors', 'Leah Connors']
Calvin Cosmo: ['Sally Patterson', 'Shawn Patterson']
Leah Connors: ['Frank Connors', 'John Patterson', 'Shawn Patterson']

当前的“示例文本”:

Connors, Leah
Flying Club
Connors, Frank
Patterson, Shawn
Patterson, John

Cosmo, Calvin
Sailing buddies
Dodge ball group
Patterson, Shawn
Patterson, Sally 

Connors, Frank 
Rowing school
Connors, Leah
Connors, Robert
于 2012-04-04T00:06:09.637 回答