我有一个程序可以处理日志文件,将其缩小到两个项目。这就是我所得到的,这就是我的程序停止的地方,如下所示。但是我需要将两个项目中的第一个放入一个方程中,并将第二个项目放入另一个方程中。我该怎么做?
import pylab
from pylab import *
from numpy import *
from collections import Counter
list_of_files=[('logfile.txt', 'F')]
datalist = [( pylab.loadtxt(filename), label ) for filename, label in list_of_files]
for data, label in datalist:
print [k for k,v in Counter(data[:,1]).items() if v>1 and 1500<=k<2200]
当我运行上面的程序时,它会打印类似[1685, 1650]
所以我现在需要添加到上面的程序中,以便它自动将第一个数字 1685 放入一个方程中,然后将第二个数字 1650 放入另一个方程中并打印结果。
您无法从打印的内容中挑选出值。一旦打印出来,它就会被遗忘。
你必须将事物存储在变量中。然后你可以很容易地挑选出来。
例如,代替这个:
print [k for k,v in Counter(data[:,1]).items() if v>1 and 1500<=k<2200]
这样做:
thingies = [k for k,v in Counter(data[:,1]).items() if v>1 and 1500<=k<2200]
print thingies
print first_equation(thingies[0])
print second_equation(thingies[1])
您正在使用Counter
来构建结果。Counter
,像dict
一样,没有顺序。 如果你加上a
,然后是b
,然后是c
,你可能会得到a
,然后是c
,然后是b
,或其他5个排列中的任何一个。
如果您需要保留原始订单,则必须手动处理。您可以通过使用单独的"键列表"、迭代k in keylist
而不是k, v in counter.items()
以及使用counter[k]
代替v
来做到这一点。或者,更简单地说,只需用OrderedDict
和Counter
构建一个OrderedCounter
(如文档中的配方所示(,然后使用它:
thingies = [k for k,v in OrderedCounter(data[:,1]).items() if v>1 and 1500<=k<2200]
另一方面,如果您需要按某种排序顺序排列最终结果,则可以在事后对它们进行排序:
thingies = sorted(k for k,v in Counter(data[:,1]).items() if v>1 and 1500<=k<2200)
在您的情况下,您需要"较高的值数字是 [0]",这听起来像您希望对它们进行排序,但顺序相反。所以:
thingies = sorted((k for k,v in Counter(data[:,1]).items() if v>1 and 1500<=k<2200),
reverse=True)
*当然,这不是真的;他们确实有一些顺序。但是这个顺序通常是没有用的,也不值得了解,除了重复迭代同一个字典而中间没有变化将始终得到相同的顺序。