0

次の構文を持つファイルから読み込んでいます。

Akaka D HI -1 -1 1 1 1 -1 -1 1 1 1 1 1 1 1 -1 1 1 1 -1 1 1 1 1 1 -1 1 -1 -1 1 1 1 1 1 1 0     0 1 -1 -1 1 -1 1 -1 1 1 -1
Alexander R TN 1 1 1 1 1 1 1 1 1 -1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1

名前を投票のリストにマップする辞書を作成する必要があります。この場合の名前は Akaka と Alexander で、投票は -1、0、1 の一連の数字です。出力例は次のようになります。

{'Akaka': [-1 -1 1 1 1 -1 -1 1 1 1 1 1 1 1 -1 1 1 1 -1 1 1 1 1 1 -1 1 -1 -1 1 1 1 1 1 1 0 0 1 -1 -1 1 -1 1 -1 1 1 -1], 'Alexander': [1 1 1 1 1 1 1 1 1 -1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1]...,'name':[list of votes in integer form]}

これは私が使用したコードです:

for line in voting_data:
    myList.append(line.strip().split(' '))
names = []
votes = []
intVotes = []
votingDict = {}
for i in myList:
    names.append(i[0])
for j in names:
    votes.append(i[3:])
for k in votes:
    intVotes.append([int(v) for v in k])

votingDict = {names[i]:votes[j] for i in range(len(names)) for j in range(len(votes))}
print votingDict

最初のいくつかの出力は次を返します (Pyror は別の名前で、Bunning も同様です)。

{'Pryor': ['-1', '-1', '1', '1', '1', '-1', '-1', '1', '1', '1', '1', '1', '-1', '1', '1', '1', '1', '1', '-1', '1', '1', '1', '1', '1', '1', '1', '-1', '-1', '1', '1', '1', '1', '1', '1', '1', '-1', '1', '-1', '1', '1', '1', '1', '-1', '1', '1', '-1'], 'Bunning': ['-1', '-1', '1', '1', '1', '-1', '-1', '1', '1', '1', '1', '1', '-1', '1', '1', '1', '1', '1', '-1', '1', '1', '1', '1', '1', '1', '1', '-1', '-1', '1', '1', '1', '1', '1', '1', '1', '-1', '1', '-1', '1', '1', '1', '1', '-1', '1', '1', '-1']

私の問題は、間違った名前が間違ったリストにマップされていることです。つまり、Pryor にマップされたリストは、実際には Alexander にマップされるべきリストです。リストは正しい順序になっていますが、名前が正しくありません。この辞書の名前を並べ替える方法はありますか?

4

2 に答える 2

2

リストの再結合が間違っています:

votingDict = {names[i]:votes[j] for i in range(len(names)) for j in range(len(votes))}

これにより、並列ループではなく、ネストされたループが作成されます。ここでの通常の解決策は、次を使用することzip()です。

votingDict = {name: vote for name, vote in zip(names, votes)}

votingDictただし、ファイルをループしながらマッピングを作成することで、コードを大幅に簡素化できます。

votingDict = {}
for line in voting_data:
    name, ign1, ign2, *votes = line.split()
    votingDict[name] = [int(v) for v in votes]

str.split()引数なしでは、可変幅の空白で分割され、末尾と先頭の空白がすべて一度に削除されます。

その後、リスト出力を一連の名前に割り当てることができます。これには、残りの項目の包括的なスター付きの名前が含まれます。これを使用して、名前、無視された 2 つの列、およびリスト内の残りをキャプチャvotesし、リスト内包表記で整数に変換します。

于 2013-07-10T19:19:16.597 に答える
1

3 つのループで物事を過度に複雑にしていると思います (正しく読めば、ネストする必要があります)。これを簡単に行うことができます:

votingDict = {}
for line in voting_data:
    parts = line.strip().split(' ')
    name = parts[0]
    votes = [int(v) for v in parts[3:]]
    votingDict[name] = votes

基本的に、行を読むときに、名前と投票を抽出し、投票を整数に変換して辞書に保存します。

于 2013-07-10T19:22:20.153 に答える