从文件中读取连续两行作为值,键对

时间:2016-03-10 13:12:35

标签: python python-3.x dictionary

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

我被困在制作用户名,例如多米尼克是字典的关键,他们的分数是他们的价值。我无法做到这一点,因为在我的文本文件中,它们位于不同的行上,分数位于第一行,然后是每隔一行,而名称位于第二行,而另一行则来自那里。

1 个答案:

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