我正在尝试使用以这种格式排列的文件构建两个单独的词典:
我需要将名称反转为名字,然后使用姓氏,对于第一个字典,我需要将第一个名称作为键,将第一个名称中的其他名称作为值,即字符串列表。
第二个字典我需要再次使用第一个名称作为关键广告,将它们所属的一个或多个组作为值。
我已经想出如何使用逗号分隔它们来反转名称,但是我最终得到的所有名称的列表实际上并没有帮助我将它们分开。
我真的很困惑,我如何迭代这个来拉出这些特定的行,然后将它们作为键与其他特定行作为值关联。特别困惑的是如何将第一个名称作为键,然后将以下名称作为值,然后跳过空白行,然后重新开始,但使用新键。
文本文件格式:
文本文件的格式与没有子弹的情况完全相同, 如果正好包含第一个块,那么期望的输出双线虫会看起来像这样:
Person_to_friends = {'Leah Connors' : ['Frank Connors', 'Shawn Patterson', 'John Patterson']}
Persons_to_networks = {'Leah Connors' : ['Flying Club']}
当我尝试测试您的代码时,我收到了索引错误
Patterson,John
Cosmo,Calvin
Patterson,Sally
Connors,Frank
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
答案 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