1

この形式で配置されたファイルを使用して、2 つの個別の辞書を作成しようとしています。

名前を逆にする必要があるので、名前の次に姓を入力します。最初の辞書では、名前をキーとして、最初のブロックの他の名前を値、つまり文字列のリストとして使用する必要があります。

2 番目の辞書では、最初の名前をキーとして使用し、値として属しているグループを指定する必要があります。

コンマを使用して名前を逆に分割する方法を見つけましたが、最終的にはすべての名前のリストになり、それらを分離するのにまったく役立ちません。

これを繰り返してこれらの特定の行を引き出し、それらをキーとして他の特定の行に値として関連付ける方法について、私は本当に混乱しています。最初の名前をキーとして取得し、次の名前を値として取得し、空白行をスキップして新しいキーでやり直す方法について特に混乱しています。

テキストファイル形式:

テキスト ファイルの形式は、箇条書きなしではまったく同じです。最初のブロックだけが含まれている場合、目的の出力辞書は次のようになります。

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

コードをテストしようとしたときに、インデックス エラーが発生しました

  • コナーズ、リア
  • フライングクラブ
  • コナーズ、フランク
  • パターソン、ショーン
  • ジョン・パターソン

  • コスモ、カルヴィン

  • セーリング仲間
  • ドッジボール組
  • パターソン、ショーン
  • パターソン、サリー

  • コナーズ、フランク

  • ローイングスクール
  • コナーズ、リア
  • ロバート・コナーズ

Cosmo, CalvinConnors, Frankは 2 番目のブロックの一部であり、ブロック間に 1 つのスペースがある 3番目のブロックの一部であると想定されています。何かが機能していません。スペースを作成し続ける理由がわかりません。

これは私がこれまでに持っているものですが、私は本当に遠いと思います..助けてください

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

現在の「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
于 2012-04-04T00:06:09.637 に答える