矩阵操作 - 为什么正常循环会产生不同的结果?

时间:2021-04-15 21:41:02

标签: python loops matrix list-comprehension

我的问题与this question有关。我试图将 @shuttle87 在他/她对 the question 的回答中提供的列表理解建模为常规的老式循环。这是我的代码片段的样子:

matrix = [[2,0,2],[0,2,0],[2,0,2]]
sqd = []
for i in matrix:
    for e in i:
        sqd.append(e*e)
print(sqd)

我的问题是我的代码返回一个列表,即 [4, 0, 4, 0, 4, 0, 4, 0, 4] 而不是矩阵,即 [[4, 0, 4], [0, 4, 0], [4, 0, 4]]。我可能做错了什么?

免责声明:我知道有一些很棒的 Python 库可以为例如 numpy 执行此操作。我喜欢通过直觉来理解事物,因此这个问题......所以请原谅我的天真。

3 个答案:

答案 0 :(得分:3)

您有一个列表 internal static class Program { private static void Main(string[] args) { var config = new ConfigurationBuilder().AddJsonFile("appsetting.json", optional: false).Build(); var dynamicFieldName = config.GetSection("ServiceDesk").GetSection("field").Value; // Get json to be deserialized var json = GetJson(); var udfFields = DeserializeJsonWithDynamicFieldName(json, dynamicFieldName); // Now you can get either 'udf_pick_29744' or 28744 or 26744 by accessing 'udfFields.udf_pick_dynamic' property } private static string GetJson() { // Here is your logic how to get json string } private static UdfFields DeserializeJsonWithDynamicFieldName(string json, string dynamicFieldName) { return dynamicFieldName switch { UdfPickDynamicFieldNames.Pick29744 => JsonConvert.DeserializeObject<UdfFields29744>(json), UdfPickDynamicFieldNames.Pick28744 => JsonConvert.DeserializeObject<UdfFields28744>(json), UdfPickDynamicFieldNames.Pick26744 => JsonConvert.DeserializeObject<UdfFields26744>(json), _ => throw new ArgumentException("Unsupported dynamic field name") }; } } internal static class UdfPickDynamicFieldNames { internal const string Pick29744 = "udf_pick_29744"; internal const string Pick28744 = "udf_pick_28744"; internal const string Pick26744 = "udf_pick_26744"; } public abstract class UdfFields { public object udf_pick_34206 { get; set; } public string udf_pick_34205 { get; set; } public object udf_pick_34202 { get; set; } public object udf_mline_35402 { get; set; } public object udf_pick_34503 { get; set; } public object udf_pick_34502 { get; set; } public object udf_pick_35103 { get; set; } public object udf_pick_35101 { get; set; } public abstract object udf_pick_dynamic { get; set; } public object udf_sline_35701 { get; set; } public string udf_pick_35401 { get; set; } public object udf_pick_29753 { get; set; } } public sealed class UdfFields29744 : UdfFields { [JsonPropertyName(UdfPickDynamicFieldNames.Pick29744)] public override object udf_pick_dynamic { get; set; } } public sealed class UdfFields28744 : UdfFields { [JsonPropertyName(UdfPickDynamicFieldNames.Pick28744)] public override object udf_pick_dynamic { get; set; } } public sealed class UdfFields26744 : UdfFields { [JsonPropertyName(UdfPickDynamicFieldNames.Pick26744)] public override object udf_pick_dynamic { get; set; } } 要将标量值附加到其中,因此它始终只是一个一维列表。如果你想要一个列表列表(即二维矩阵),你需要将列表附加到 sqd,而不是标量值:

sqd

答案 1 :(得分:1)

因为您在内部 matrix = [[2,0,2],[0,2,0],[2,0,2]] sqd = [] for i in matrix: row = [] # create a new list for each row for e in i: row.append(e*e) # append scalar to the row list sqd.append(row) # append row to matrix list print(sqd) 循环内将 numbers 附加到 sqd。相反,您需要将这些数字附加到临时列表,然后将该列表附加到 for e in i

sqd

或者,作为列表理解:

matrix = [[2,0,2],[0,2,0],[2,0,2]]
sqd = []
for i in matrix:
    row = []
    for e in i:
        row.append(e*e)
    sqd.append(row)
print(sqd)

答案 2 :(得分:1)

这里有两个 for 循环。您的外循环正在通过矩阵的列。

您的内部循环正在遍历行。

在进入下一列之前,您的内部循环会贯穿整个循环。

现在您了解了该流程,您需要看到您的列表“sqd”只有一个正在执行的操作。内循环的每个循环都会发生 append 操作。您通过添加最新操作来增加该列表的每个循环。

要创建您希望看到的矩阵,您需要在内循环和外循环之间做更多工作。 我建议为您的外循环的每次迭代制作一个新列表。这个新列表将由内循环附加,一旦内循环完成,您可以将这个新的临时列表添加到“sqd”。

相关问题