if Class.lower() == ("classa"):
print("Showing results for ClassA")
NewDict = {}
with open ("ClassA.txt","r") as A:
for line in A:
我的列表在下面,我想将用户的名字作为他们的密钥并将他们的分数设为值。
3
Dominic
1
Eric
7
Joe
4
Sasha
8
Olivia
6
Callum
我被困在制作用户名,例如多米尼克是字典的关键,他们的分数是他们的价值。我无法做到这一点,因为在我的文本文件中,它们位于不同的行上,分数位于第一行,然后是每隔一行,而名称位于第二行,而另一行则来自那里。
答案 0 :(得分:1)
以下解决方案做了一些假设。第一个是文件中的行数是偶数,因为总是有一个分数后跟一行名称的行。它还假设没有重复的名称,您所显示的格式也很受尊重。
有了这个说法,这个解决方案向您展示了如何构建一个将名称映射到分数的字典,并且应该指向正确的方向。
>>> with open('ClassA.txt') as f:
... scores = {name.strip():int(score) for score, name in zip(f, f)}
...
>>> scores
{'Callum': 6, 'Sasha': 4, 'Olivia': 8, 'Joe': 7, 'Dominic': 3, 'Eric': 1}
进一步阅读:How do I read two lines from a file at a time using python
对于使用Python 2绊倒这个问题的人:考虑使用itertools.izip
来提高内存效率,尤其是在文件很大的情况下。
修改强>:
您的大多数假设都是正确的,但是名称再次使用每次三次,如果名称没有重复,您提供的代码将起作用。
你应该提到这一点。在这种情况下,我建议您将分数附加到列表中。你不能在字典中使用相同的密钥两次。
>>> from collections import defaultdict
>>> scores = defaultdict(list)
>>>
>>> with open('ClassA.txt') as f:
... for score, name in zip(f, f):
... scores[name.strip()].append(int(score))
...
>>> scores
defaultdict(<type 'list'>, {'Callum': [6, 12, 18], 'Sasha': [4, 10, 16], 'Olivia': [5, 11, 17], 'Joe': [3, 9, 15], 'Dominic': [1, 7, 13], 'Eric': [2, 8, 14]})
我用于演示的输入文件如下所示:
1
Dominic
2
Eric
3
Joe
4
Sasha
5
Olivia
6
Callum
7
Dominic
8
Eric
9
Joe
10
Sasha
11
Olivia
12
Callum
13
Dominic
14
Eric
15
Joe
16
Sasha
17
Olivia
18
Callum