python新手从文件创建两个词典需要特定的行

时间:2012-04-03 20:30:01

标签: python dictionary

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

我需要将名称反转为名字,然后使用姓氏,对于第一个字典,我需要将第一个名称作为键,将第一个名称中的其他名称作为值,即字符串列表。

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

我已经想出如何使用逗号分隔它们来反转名称,但是我最终得到的所有名称的列表实际上并没有帮助我将它们分开。

我真的很困惑,我如何迭代这个来拉出这些特定的行,然后将它们作为键与其他特定行作为值关联。特别困惑的是如何将第一个名称作为键,然后将以下名称作为值,然后跳过空白行,然后重新开始,但使用新键。

文本文件格式:

文本文件的格式与没有子弹的情况完全相同, 如果正好包含第一个块,那么期望的输出双线虫会看起来像这样:

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

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

  • Connors,Leah
  • 飞行俱乐部
  • 康纳斯,弗兰克
  • Patterson,Shawn
  • Patterson,John

  • Cosmo,Calvin

  • 帆船爱好者
  • 道奇球组
  • Patterson,Shawn
  • Patterson,Sally

  • Connors,Frank

  • 划船学校
  • Connors,Leah
  • 康纳斯,罗伯特

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

1 个答案:

答案 0 :(得分: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']

当前“exampletext”:

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