【问题标题】:Reading input from text into 2d array从文本中读取输入到二维数组
【发布时间】:2018-05-25 01:26:45
【问题描述】:

我有一个 txt 文件,其中包含金字塔格式的数字,例如:

      5
    10 7
  1  3  12

我想将它们放入二维数组(如常规矩阵)。我试过the post。但我想在所有缺失的位置上添加 0(零)。喜欢:

5,0,0
10,7,0
1,3,12

为了做到这一点,我必须知道最后一行的长度才能创建合适的二维数组。

我怎样才能做到这一点?

【问题讨论】:

  • 输入文件中是否像您显示的那样有前导空格字符?
  • 是的,我有。数据就像一个金字塔。但我想将其转换为矩阵(右空格填充零)

标签: python arrays matrix multidimensional-array text-files


【解决方案1】:

没有办法避免读取整个文件以执行您想要的操作,因为这些行都可以具有不同的长度,这意味着您无法计算它们中任何一个开始的偏移量(当然,第一个除外):

def last_row_length(filename):
    lastrow = None
    with open(filename, 'r') as f:
        for lastrow in f: pass
    return len(lastrow.split()) if lastrow is not None else 0

lastrowlen = last_row_length('pyramid.txt')
print(lastrowlen)  # -> 3

【讨论】:

  • 如果您正在寻找创建二维数组的完整解决方案,请参阅my answer
【解决方案2】:

如果您要读取文件来创建二维数组,您应该将查找最后一行的长度纳入到创建数组中,这样您就不必读取文件两次。

我假设我们事先不知道有多少行(这意味着我们不知道矩阵的每一边有多长)。我还假设您的文件名为file.txt

我们想要的是一个正在运行的列表。一旦我们读取了整个文件,我们就可以返回并添加尾随零。 Python 字符串的split() 方法在这里很有用,因为没有参数,此方法使用空格作为分隔符。这是您的文件的一个简单示例:

>>> with open('file.txt') as file:
...     for line in file:
...         print(line.split())
... 
['5']
['10', '7']
['1', '3', '12']

以下代码将这些列表中的每一个保存为名为@9​​87654325@ 的列表的元素:

rows = []
with open('file.txt') as file:
    for line in file:
        rows.append(line.split())

现在剩下的就是检查最后一行的长度,在每个列表的末尾添加零,然后以您想要的漂亮格式打印它。这是完整的解决方案:

rows = []
with open('file.txt') as file:
    for line in file:
        rows.append(line.split())
size = len(rows[-1])
for i in range(len(rows)):
    rows[i] = rows[i] + ['0'] * (size - len(rows[i]))
for row in rows:
    print(','.join(row))

【讨论】:

  • 感谢它的工作,我接受了它。 size = len(rows[-1]) 是做什么的?我不明白行[-1]...为什么-1?
  • 如果n 是一个整数,rows[n] 返回nrows 的第一个元素。这称为indexing。它也可以从最后开始使用,使用负数。 rows[-1] 获取 rows 的最后一个元素。 len() 然后获取 rows 的最后一个元素的长度。
【解决方案3】:

最后一行的元素个数就是你倒过来读第一行的元素个数。

line.rstrip()

你试过这个吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    相关资源
    最近更新 更多