假设我有多个值:(左列只是值计数:1,2,3等;右边是实际值)
1 5.2
2 1.43
3 3.54
4 887
5 0.35
我想要做的是将值从降序重新排序到增加(自上而下),然后我想让python遍历值并继续选择值(稍后用作输出),直到它遇到一个等于或高于某个阈值的值。例如:
5 0.35
2 1.43
3 3.54
1 5.2
4 887
说,我的阈值是5.0,所以在这里我希望程序丢弃1和4(高值),并输出5,2和3作为输出及其相应的值。我希望这是有道理的。如果(无论出于什么原因)我的阈值只允许2个值,我也希望忽略所有内容并给出类似“没有找到值”的内容,这也是一个棘手的技巧。
他们所处的文件(值和数量)大致如下所示:
ID some: value another: value another: value another: value another: value another: value 1: 5.2
等等,上述每个值对应于文件中的新行。所以我感兴趣的东西分别位于第x行,第14和第15行。
实际行看起来像这样:
Mod# 2 11494 Chi^2: 1.19608371367 Scale: 0.567691651772 Tin: 1499 Teff: 3400 Luminosity: 568.0 L M-dot: 4.3497e-08 Tau: 2.44E-01 Dust composition: Fe IRx1: 0.540471121182
我对IRx1及其后的值感兴趣。
答案 0 :(得分:3)
假设您的文件每行有一个数字:
threshold = 5
with open('path/to/file') as infile:
numbers = [float(line.strip()) for line in infile]
numbers.sort(reverse=True)
bigger = list(itertools.takewhile(lambda n: n<threshold, numbers))
如果您的文件如下所示:
1 5.2
2 1.43
3 3.54
4 887
5 0.35
,您希望输出为set([2,3,5])
,然后:
with open('path/to/file') as infile:
numbers = dict([float(i) for i in line.strip()] for line in infile)
lines = sorted(numbers, key=numbers.__getitem__, reverse=True)
answer = list(itertools.takewhile(lambda n: numbers[n]<threshold, lines))
给定一个如下所示的文件:
Mod# 2 11494 Chi^2: 1.19608371367 Scale: 0.567691651772 Tin: 1499 Teff: 3400 Luminosity: 568.0 L M-dot: 4.3497e-08 Tau: 2.44E-01 Dust composition: Fe IRx1: 0.540471121182
如果有一个分隔\t
和11494
的标签(Chi^2
),则以下脚本应该有效:
def takeUntil(fpath, colname, threshold):
lines = []
with open(fpath) as infile:
for line in infile:
ldict = {}
firsts = line.split('\t', 2)
ldict[firsts[0] = float(firsts[1])
splits = firsts[2].split('\t')
ldict.update(dict(zip(firsts, itertools.islice(firsts, 1, len(firsts)))))
lines.append(ldict)
lines.sort(reverse=True, key=operator.itemgetter(colname))
return [row['Mod#'] for row in itertools.takewhile(lambda row: row[colname]<threshold, lines)]
使用该功能,您应该能够指定要检查哪个列的值低于阈值。虽然这个算法确实具有更高的空间复杂度(使用更多的RAM而不是绝对必要的),但是你应该能够在读取文件之后编组/挑选lines
并继续从那里进行后续运行。如果你有一个需要一段时间来处理的巨大输入文件(我怀疑你可能有),这个特别有用
答案 1 :(得分:3)
以下解决方案假定数据是作为元组列表读入的。
前:
[(1,5.2),
(2,1.43),
(3,3.54),
(4,887),
(5,0.35)]
将是问题中样本数据的列表。
def cutoff(threshold, data):
sortedData = sorted(data, key=lambda x: x[1])
finalList = filter(lambda x: x[1] < threshold, sortedData)
return finalList if len(finalList) > 2 else 'No values found'
函数的第一行按元组第二位的值对列表进行排序。
该函数的第二行然后过滤结果列表,以便只保留值低于阈值的元素。
第三行然后返回结果排序列表,如果它包含两个以上的元素,否则“找不到值”,这应该完成你要做的事情,减去文件输入。