繁体   English   中英

在第一个元素在特定范围内的元组中找到元组列表中的最小值

[英]Find minimum in a list of tuple among those tuples whose first elements are within a specific range

我有一个元组列表如下:

list = [(9.9394, 0.9924), (9.8428, 0.6171), (9.9023, 0.5584), (9.8369, 1.0), (9.2106, 0.5339), (9.9748, 0.7131), (9.3257, 0.02725), (11.2865, 0.849), (10.4556, 0.7542), (10.1655, 0.9792), (10.3677, 0.5712), (10.5253, 0.8986), (10.5186, 0.5215)]

我想制作另一个由7个元素组成的列表,其中每个元素是list的第二个元素中的最小值,其第一个元素在特定范围内。

第一个元素对应bin(8.0,8.6),第二个元素对应bin(8.6,9.2),第三个元素对应bin(9.2,9.8),第四个元素对应bin(9.8,10.4),第五个元素对应bin bin(10.4,11.0),第六个到bin(11.0,11.6),最后是第七个到bin(11.6,12.2),都对应于list中元组的第一个元素。

示例:第四个元素对应于第四个bin(9.8,10.4)。 list有7个元组,其第一个元素位于此范围内:

(9.9394,0.994),(9.8428,0.6171),(9.9023,0.5584),(9.8369,1.0),(9.2106,0.5339),(9.9748,0.7131),(9.3257,0.02725)

所以,新列表的第4个元素应该是第二个元素中的最小元素:

0.9924,0.6171,0.5584,1.0,0.5339,0.7131,0.02725

这是0.02725

是否有以下代码的任何较短版本来建立所有七个元素,从而以这种方式建立新的最小值列表? 最短的答案将被接受。

dm7=0.6
item1, item2, item3, item4, item5, item6, item7 = 0, 0, 0, 0, 0, 0, 0
set1, set2, set3, set4, set5, set6, set7 = [], [], [], [], [], [], []
list = [(9.9394, 0.9924), (9.8428, 0.6171), (9.9023, 0.5584), (9.8369, 1.0), (9.2106, 0.5339), (9.9748, 0.7131), (9.3257, 0.02725), (11.2865, 0.849), (10.4556, 0.7542), (10.1655, 0.9792), (10.3677, 0.5712), (10.5253, 0.8986), (10.5186, 0.5215)]

for item in list:
    if (8. +  0*dm7 <= item[0] <= 8. +  1*dm7):
        set1.append(item[1]) 
        item1 = min(set1)
    elif (8. +  1*dm7 <= item[0] <= 8. +  2*dm7):
        set2.append(item[1])
        item2 = min(set2)
    elif (8. +  2*dm7 <= item[0] <= 8. +  3*dm7):
        set3.append(item[1])
        item3 = min(set3)
    elif (8. +  3*dm7 <= item[0] <= 8. +  4*dm7):
        set4.append(item[1])
        item4 = min(set4)
    elif (8. +  4*dm7 <= item[0] <= 8. +  5*dm7):
        set5.append(item[1])
        item5 = min(set5)
    elif (8. +  5*dm7 <= item[0] <= 8. +  6*dm7):
        set6.append(item[1])
        item6 = min(set6)
    elif (8. +  6*dm7 <= item[0] <= 8. +  7*dm7):
        set7.append(item[1])
        item7 = min(set7)

new_list = [item1, item2, item3, item4, item5, item6, item7]

这是我想出来的,假设我了解你的情景。

from bisect import bisect

items = [(9.9394, 0.9924), (9.8428, 0.6171), (9.9023, 0.5584), (9.8369, 1.0), (9.2106, 0.5339), (9.9748, 0.7131), (9.3257, 0.02725), (11.2865, 0.849), (10.4556, 0.7542), (10.1655, 0.9792), (10.3677, 0.5712), (10.5253, 0.8986), (10.5186, 0.5215)]

thresholds = [x / 10 for x in range(80, 123, 6)] # [8.0, 8.6, 9.2, 9.8, 10.4, 11.0, 11.6, 12.2]
bins = [list() for _ in range(len(thresholds) - 1)] # Set number of bins to 1 less than threshold points

for sorting_key, value in items: # Iterate over items to place into respective bin
    bins[bisect(thresholds, sorting_key) - 1].append(value)

from pprint import pprint
pprint(bins)

输出将是:

[[],
 [],
 [0.5339, 0.02725],
 [0.9924, 0.6171, 0.5584, 1.0, 0.7131, 0.9792, 0.5712],
 [0.7542, 0.8986, 0.5215],
 [0.849],
 []]

如果你需要获得最小值,只需在每个上使用内置的min()函数。

min_each = [min(b) if b else None for b in bins] # [None, None, 0.02725, 0.5584, 0.5215, 0.849, None]

在上面的代码中,我没有使用map(min, bins)因为min()不能在空列表上运行。

您可以使用numpy来提升性能。 使用numpy.digitize您可以计算每个项目所属的组。 然后通过一些重塑,您可以计算每个组的最小值。

import numpy as np


items = [(9.9394, 0.9924), (9.8428, 0.6171), (9.9023, 0.5584), (9.8369, 1.0), (9.2106, 0.5339), (9.9748, 0.7131), (9.3257, 0.02725), (11.2865, 0.849), (10.4556, 0.7542), (10.1655, 0.9792), (10.3677, 0.5712), (10.5253, 0.8986), (10.5186, 0.5215)]
items = np.asarray(items)

bins = np.linspace(8.0, 12.2, 8)
indices = np.digitize(items[:, 0], bins)  # Check which item corresponds to which bin.
mask = np.tile(indices, (bins.size, 1)) == np.arange(bins.size)[:, None]  # For each group check the members.

result = np.where(mask, items[:, 1], np.inf).min(axis=1)
result[result == np.inf] = 0  # Set default value if no items are available for that group.

print('result: ', result)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM