1

我正在上python课,没有python经验。讲师只教文档,拒绝给出代码示例。我了解 C++,但我对 python 感到非常沮丧,因为我基本上是在自学。

我想打开一个文本文件,其中每行包含一串随机字符。例如,长度可以是 8、10、15 或 20 个字符。它必须是灵活的。文本文件中可以有未指定数量的字符串(行)。

例如,文本文件可能如下所示:

HGAMONIHRA
AOMOKAWONS
NFROLBOBDN
ARFSIHCAGE
LNIEEWONOK
GOLFUNDTHC
KOCATAOHBI
AMRERCGANH
SLGFAMALLC
ALLIGATORX

我只是想弄清楚如何将每个字符放在一个类似数组的结构中,我可以像访问二维数组一样访问它——>我的数组 [2] [3],例如。

我正在用字典练习只是为了测试行为。我认为我可以使用带有嵌套 for 循环的字典,然后使用元组作为键并将字符串中的解析字符作为值传递。我在想这可能有用,但是当我尝试用一​​行来制作字典时,我的打印语句只给了我一个键和一个值,而不是列表。我真的很困惑。我知道这很痛苦,但有人可以简单地教我吗?蟒蛇在我嘴里留下难闻的味道。

这是我仅针对文本文件的一行的测试代码:

count = 0
text = open("puzzle.txt")
line = text.readline()
for i in line:  #this is probably the problem
    mydict = dict()
    mydict.update({count:line[count-1]}) #was hoping to make many keys and values.
    count += 1

print mydict.values() #want to see there are multiple dict values, each as a char.
print count #just checking to see what count value was

有人可以教我吗,因为我的老师不会,我真的很想学习。

4

3 回答 3

2

乍一看,您的代码有一个明显的问题 -mydict每次通过循环时,您都会重置为一个空的字典,您的行:

    mydict = dict()

如果您将其移动到循环之前,您可以进一步测试以查看是否还有其他问题需要修复。

但是,有一种更直接的方法可以实现您想要的:

>>> with open("puzzle.txt") as f:
...     puzzle = [list(line.strip()) for line in f]

这将打开您的文件puzzle.txt并将其分配给变量f,然后将文件中的每一行读入字符串变量line,去除所有空格(包括末尾的换行符),将生成的字符串转换为字符列表,最后收集每个这些列表中的另一个列表,它分配给变量puzzle。最后,因为所有这些都是在with语句中完成的,所以文件会自动关闭。

上面的代码中有几个重要的 Python 概念:

如果使用 pprint 模块中的pprint函数可以更清楚地看到这段代码的结果:

>>> from pprint import pprint
>>> pprint(puzzle)
[['H', 'G', 'A', 'M', 'O', 'N', 'I', 'H', 'R', 'A'],
 ['A', 'O', 'M', 'O', 'K', 'A', 'W', 'O', 'N', 'S'],
 ['N', 'F', 'R', 'O', 'L', 'B', 'O', 'B', 'D', 'N'],
 ['A', 'R', 'F', 'S', 'I', 'H', 'C', 'A', 'G', 'E'],
 ['L', 'N', 'I', 'E', 'E', 'W', 'O', 'N', 'O', 'K'],
 ['G', 'O', 'L', 'F', 'U', 'N', 'D', 'T', 'H', 'C'],
 ['K', 'O', 'C', 'A', 'T', 'A', 'O', 'H', 'B', 'I'],
 ['A', 'M', 'R', 'E', 'R', 'C', 'G', 'A', 'N', 'H'],
 ['S', 'L', 'G', 'F', 'A', 'M', 'A', 'L', 'L', 'C'],
 ['A', 'L', 'L', 'I', 'G', 'A', 'T', 'O', 'R', 'X']]

...并且您可以完全按照您在问题中提出的方式访问单个字符:

>>> puzzle[2][3]
'O'
于 2013-02-11T04:00:16.813 回答
2

Python 字符串被视为不可变集合(类似于元组),因此您只需要保存每行的一组字符串。

count = 0
text = open("puzzle.txt", 'r')
myLines = text.readlines()

#Usage;
print myLines[0][0]
# Prints the first character

因为 python 字符串是不可变的,所以您需要将整个索引设置为新字符串

myLines[0] = mylines[0:1] + 'G' + myLines[2:]
于 2013-02-11T03:38:18.350 回答
1

您可以使用列表列表来做到这一点:

>>> with open('puzzle.txt') as f:
...   a = [list(line.rstrip()) for line in f]
... 
>>> a[0,3]
>>> a[0][3]
'M'
>>> a[1][0]
'A'
于 2013-02-11T03:37:31.423 回答