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()没有参数将在可变宽度空格上拆分并删除尾随和前导空格,一次完成。

然后,您可以将列表输出分配给一系列名称,包括其余项目的全部星标名称;我使用它来捕获名称、两个被忽略的列,然后是列表中的其余部分,votes然后我们将其转换为具有列表理解的整数。

于 2013-07-10T19:19:16.597 回答
1

我认为您的三个循环使事情变得过于复杂(如果我没看错的话,应该嵌套)。你可以简单地这样做:

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 回答