【问题标题】:Translate VBA array into Python将 VBA 数组转换为 Python
【发布时间】:2016-09-02 12:01:16
【问题描述】:

使用空闲/Python 3.5.1

首先,我可以先说我是一名相当有经验的 VBA 程序员,但现在是 Python 的第 2 天。我向你保证,我已经对这个问题进行了多次搜索,但我阅读的 30 多份文件似乎无法解释我的问题。

我还可以要求给出的任何答案都是 Python 3.5.1 格式正确的代码,而不是指向其他文档或链接的有用指针吗?

问题

我正在运行报告并输出结果。我需要在此期间存储结果(大概在一个数组中),以便以后可以参考它们。报告(以及数组的填充)可以重新运行多次,因此如果在构建数组时使用“附加”等概念,请记住这一点。该数组的维度为 [25,4] - 最多 25 条记录,每条记录 4 项。

Day   X  Y  Z  Total
1     2  3  4  9
2     3  4  5  12 ...

(Purists: The total needs to be recorded rather than calculated because of rounding.)

如果有人可以将这段代码翻译成 Python(出于说明目的来自 VBA),我可以自己解决问题。我不想导入数组模块,除非它是唯一的方法。注意:变量 l 是一个循环,它使数组构建两次,以证明数组需要能够从头开始重建,而不是只创建一次。

Sub sArray()
    Dim a(25, 4)
    For l = 1 To 2 
        For i = 1 To 25
            For j = 1 To 4
                a(i, j) = Int(100 * Rnd(1)) + 1
                Debug.Print a(i, j);
            Next j
        Next i
    Next l
End Sub

谢谢,

汤姆

【问题讨论】:

  • 一般来说,有序的对象序列在pythonlists中处理。 arrays 有更具体、更不常见的用例。 Are you sure you want arrays?
  • 如果列表是 Python 中的标准,我不需要使用数组。我只需要知道如何做同样的事情。

标签: arrays list python-3.x


【解决方案1】:

我不确定我是否正确地回答了您的问题... 如果你想创建一个大小为 [25,4] 的数组(在这种情况下列出 i 是一个更好的术语),这是一种方法:

import random
a = [[int(100*random.random())+1 for j in range(4)] for i in range(25)]

>>> print a
[[74, 17, 36, 75],
 [1, 79, 33, 90],
 [58, 66, 47, 95],
 [35, 40, 87, 38],
 [43, 46, 34, 66],
 [69, 34, 26, 49],
 [56, 83, 44, 14],
 [2, 44, 54, 97],
 [50, 21, 39, 60],
 [13, 94, 12, 48],
 [36, 13, 2, 71],
 [77, 44, 31, 11],
 [56, 26, 30, 39],
 [17, 13, 83, 84],
 [54, 37, 34, 18],
 [5, 54, 88, 100],
 [22, 77, 70, 21],
 [51, 88, 26, 97],
 [69, 33, 86, 48],
 [42, 66, 38, 78],
 [71, 43, 96, 23],
 [6, 46, 100, 29],
 [32, 86, 15, 48],
 [96, 84, 8, 56],
 [29, 64, 69, 79]]

如果你想表明“数组需要能够从头开始重建,而不是只创建一次”(你为什么需要这个??)

for l in range(2):
    a = [[int(100*random.random())+1 for j in range(4)] for i in range(25)]

另外,生成随机数的方式很奇怪(我已经翻译了你的方法)。要在 python 中获得相同的结果,只需使用random.randint(1,100) 生成从 1(我认为你不想在那里有 0)到你喜欢的任何数字的随机整数。

如果我从您的 cmets 中正确理解,这就是您想要的:

def report(g=25):
    array = []
    for _ in range(g):
        x = random.randint(1,10)
        y = random.randint(1,10)
        z = random.randint(1,10)
        total = x+y+x
        row = [x,y,z,total]
        print(row)
        array.append(row)
    return array

result = report()
#prints all the rows while computing

>>> result #stores the "array"
[8, 4, 3, 20]
[10, 7, 4, 27]
[2, 4, 5, 8]
[8, 5, 8, 21]
[9, 7, 2, 25]
[2, 2, 3, 6]
[5, 8, 6, 18]
[8, 6, 1, 22]
[7, 6, 4, 20]
[7, 2, 10, 16]
[6, 5, 9, 17]
[3, 8, 8, 14]
[9, 1, 9, 19]
[1, 7, 7, 9]
[6, 6, 2, 18]
[9, 10, 1, 28]
[4, 6, 2, 14]
[6, 1, 6, 13]
[4, 1, 3, 9]
[5, 3, 5, 13]
[7, 5, 2, 19]
[9, 5, 7, 23]
[2, 5, 8, 9]
[3, 10, 4, 16]
[5, 6, 5, 16]

【讨论】:

  • 您可能应该注意到,当您使用提问者的“数组”术语时,您实际上是在处理列表。 Arrays 确实存在于 python 中并且是不同的动物。
  • 那家伙表示要求避免导入array,所以我认为list是唯一的选择。
  • 我同意,但继续混淆你的答案中的术语只会造成更多的混乱。
  • 好的。回归本源。 1. 我运行一个函数来输出计算数据的报告(不是随机数——它们只是为了说明)。 2. 我需要存储结果以备后用。我认为数组或列表将是存储它们的地方。 3. 我可能会重新运行我的报告 - 需要覆盖“数组”。这有助于澄清情况吗?
  • @TomPC 你写的“如果有人能把这段代码翻译成 Python,我可以自己解决这个问题”我就是这么做的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 2015-07-12
  • 2013-05-12
相关资源
最近更新 更多