感谢您回答之前的问题,我做了以下操作,但我正在尝试执行此循环,但没有给出错误。我正在尝试做日期差异。
In[7] = Import["testA.txt", "Table" , "HeaderLines" -> 1]
Out[7] = {{100, 2010, 2, 20, 2010, 8, 30}, {110, 2010, 4, 30, 2010, 9,
12}, {112, 2010, 8, 20, 2010, 10, 28}}
In[10] = For[i = 1, i < 4,
i = i + 1, {a = Out[7] [[i, 2]], b = Out[7] [[i, 3]],
c = Out[7] [[i, 4]] , d = Out[7][[i, 5]], e = Out[7][[i, 6]],
f = Out[7][[i, 7]], DateDifference[{a, b, c}, {d, e, f}]}]
答案 0 :(得分:3)
是。因为[]不生成输出。您想要计算机的差异被计算(191,135和69),并且结果不会被写入或存储在任何地方。为了明白这一点,请将DateDifference []调用重写为Print[DateDifference[{a,b,c},{d,e,f}]];
。
没有任何关于你想要发生什么的进一步暗示。目前尚不清楚如何提供更多建议。你可以播种[]和收割[]。您可以将[] DateDifference []的结果加入到结果列表中。您可以打印差异(如上所述)。您可以将结果分配给某些变量,定义符号以获取特定输入的值,等等,等等...
- 编辑 -
哦,为了解决其他一些受访者,此代码的正确形式为:
foo = Import["testA.txt", "Table" , "HeaderLines" -> 1]; diff[in_List] := Join[in[[Range[2, 7]]], {DateDifference[in[[Range[2, 4]]], in[[Range[5, 7]]]]}] diff /@ foo
输出为:{{2010, 2, 20, 2010, 8, 30, 191}, {2010, 4, 30, 2010, 9, 12, 135}, {2010, 8, 20, 2010, 10, 28, 69}}
(你可能也希望在某处分配)。
答案 1 :(得分:3)
因为您似乎想要单独处理每个列表元素,所以我会使用Map
(或其简称/@
),如下所示。
In[1]:=data = {{100, 2010, 2, 20, 2010, 8, 30},
{110, 2010, 4, 30, 2010, 9, 12},
{112, 2010, 8, 20, 2010, 10, 28}};
#~Join~{DateDifference[#[[2;;4]],#[[5;;]]]}& /@ data
Out[1]:={191, 135, 69}
Mathematica主要是一种函数式编程语言,因此虽然存在类似For
的构造,但通常更好地考虑操作和转换表达式的函数。通常,如果您需要For
这样的程序流程,Table
是更好的选择。
我的代码有一个轻微的缺点,缺少命名变量有时会很痛苦。然而,在这种情况下,它们不是必需的。但是,如果您需要它们,可以使用几种结构With
,Block
,Module
,甚至Function
。
答案 2 :(得分:3)
这是您的程序已更正并正在运行。我发布它是因为我看到你的代码中可能存在概念错误,我认为有一个正在运行的版本可以帮助你识别和学习。
有些观点:
这是一个正在运行的代码:
x = Import["testA.txt", "Table" , "HeaderLines" -> 1]
ret = {};
For[i = 1, i <= Length@x, i++,
AppendTo[ret,
{a = x[[i, 2]],
b = x[[i, 3]],
c = x[[i, 4]],
d = x[[i, 5]],
e = x[[i, 6]],
f = x[[i, 7]],
DateDifference[{a, b, c}, {d, e, f}]}
];
];
Print@ret
但正如我所说,这不是走的路。阅读和学习(并在调试中运行!)rcollyer的答案是为了理解如何在Mathematica中正确地完成它。
BTW,您可以用表替换For循环(参见rcollyer的建议)
Table[
{a = x[[i, 2]],
b = x[[i, 3]],
c = x[[i, 4]],
d = x[[i, 5]],
e = x[[i, 6]],
f = x[[i, 7]],
DateDifference[{a, b, c}, {d, e, f}]}, {i, Length@x}]