如何解决矩阵操作 - 为什么正常循环会产生不同的结果?
我的问题与this question有关。我试图将 @shuttle87 在他/她对 the question 的回答中提供的列表理解建模为常规的老式循环。这是我的代码片段的样子:
matrix = [[2,2],[0,2,0],[2,2]]
sqd = []
for i in matrix:
for e in i:
sqd.append(e*e)
print(sqd)
我的问题是我的代码返回一个列表,即 [4,4,4]
而不是矩阵,即 [[4,4],[4,4]]
。我可能做错了什么?
免责声明:我知道有一些很棒的 Python 库可以为例如 numpy 执行此操作。我喜欢通过直觉来理解事物,因此这个问题......所以请原谅我的天真。
解决方法
您有一个列表 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
,
因为您在内部 matrix = [[2,2],[0,2,0],[2,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,2]]
sqd = []
for i in matrix:
row = []
for e in i:
row.append(e*e)
sqd.append(row)
print(sqd)
,
这里有两个 for 循环。您的外循环正在通过矩阵的列。
您的内部循环正在遍历行。
在进入下一列之前,您的内部循环会贯穿整个循环。
现在您了解了该流程,您需要看到您的列表“sqd”只有一个正在执行的操作。内循环的每个循环都会发生 append 操作。您通过添加最新操作来增加该列表的每个循环。
要创建您希望看到的矩阵,您需要在内循环和外循环之间做更多工作。 我建议为您的外循环的每次迭代制作一个新列表。这个新列表将由内循环附加,一旦内循环完成,您可以将这个新的临时列表添加到“sqd”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。