分类 Python 中的元组列表
Categorization the list of tuples in Python
请帮助我,我正在尝试找出最快且合乎逻辑的方法来按第一个元组元素的值对元组列表进行分类。
例如,我有一个包含
这样的元组的列表
a = [(378, 123), (100, 12), (112, 23), (145, 14), (165, 34), (178, 45), (227, 32), (234, 12), (356, 15)] # and more and more
我如何将其动态分类为
这样的组
100to150 = [(100, 12), (112, 23), (145, 14)]
150to200 = [(165, 34), (178, 45)]
200to250 = [(227, 32), (234, 12)]
350to400 = [(378, 123), (356, 15)]
这样我用了step 50,当然我想有能力改变它。输出什么并不重要,例如可能在列表中列出
[[(100, 112), (124, 145)], [(165, 12), (178, 12)], [(234, 14)], [(356, 65)]]
(随机数据)或者可能是带有元组的列表,没关系。我只想能够获取类别的长度并打印类别。非常感谢。
l = [x for x in a if 100<x[0]<150]
我应该说这是您开始工作所需的最低限度。如果您想要完整的解决方案,您可以想象将其放入某种类型的函数中,其中您的低和高(本例中为 100、150)是参数。你甚至可以有一个 highs/lows 的列表,然后循环遍历它们并将所有输出收集为元组列表的列表。
你可以尝试这样的事情。这当然会给你一个分类字典,而不是单独的变量。
a = [(378, 123), (100, 12), (112, 23), (145, 14), (165, 34), (178, 45), (227, 32), (234, 12), (356, 15)] # and more and more
def categorize(array, step=50):
d = dict()
for e in array:
from_n = e[0]//step*step
s = f'{from_n}to{from_n+step}'
if s not in d:
d[s] = []
d[s].append(e)
return d
print(categorize(a))
输出:
{'350to400': [(378, 123), (356, 15)], '100to150': [(100, 12), (112, 23), (145, 14)], '150to200': [(165, 34), (178, 45)], '200to250': [(227, 32), (234, 12)]}
你可以看到这样的东西:
使用字典存储分组值,以便稍后立即获取它们。
def categorize_by_first(pairs, step=50):
d = {}
for pair in pairs:
range_start = (pair[0] // step) * step
dict_key_name = f"{range_start}_{range_start + step}"
if not d.get(dict_key_name):
d[dict_key_name] = []
d[dict_key_name].append(pair)
return d
输出:
{'350_400': [(378, 123), (356, 15)],
'100_150': [(100, 12), (112, 23), (145, 14)],
'150_200': [(165, 34), (178, 45)],
'200_250': [(227, 32), (234, 12)]}
分组的时间复杂度为 O(n)(我们只对输入列表进行一次迭代)。
getting element from a dictionary 的时间复杂度为 O(1)
所以这应该是有效的。
请帮助我,我正在尝试找出最快且合乎逻辑的方法来按第一个元组元素的值对元组列表进行分类。 例如,我有一个包含
这样的元组的列表a = [(378, 123), (100, 12), (112, 23), (145, 14), (165, 34), (178, 45), (227, 32), (234, 12), (356, 15)] # and more and more
我如何将其动态分类为
这样的组100to150 = [(100, 12), (112, 23), (145, 14)]
150to200 = [(165, 34), (178, 45)]
200to250 = [(227, 32), (234, 12)]
350to400 = [(378, 123), (356, 15)]
这样我用了step 50,当然我想有能力改变它。输出什么并不重要,例如可能在列表中列出
[[(100, 112), (124, 145)], [(165, 12), (178, 12)], [(234, 14)], [(356, 65)]]
(随机数据)或者可能是带有元组的列表,没关系。我只想能够获取类别的长度并打印类别。非常感谢。
l = [x for x in a if 100<x[0]<150]
我应该说这是您开始工作所需的最低限度。如果您想要完整的解决方案,您可以想象将其放入某种类型的函数中,其中您的低和高(本例中为 100、150)是参数。你甚至可以有一个 highs/lows 的列表,然后循环遍历它们并将所有输出收集为元组列表的列表。
你可以尝试这样的事情。这当然会给你一个分类字典,而不是单独的变量。
a = [(378, 123), (100, 12), (112, 23), (145, 14), (165, 34), (178, 45), (227, 32), (234, 12), (356, 15)] # and more and more
def categorize(array, step=50):
d = dict()
for e in array:
from_n = e[0]//step*step
s = f'{from_n}to{from_n+step}'
if s not in d:
d[s] = []
d[s].append(e)
return d
print(categorize(a))
输出:
{'350to400': [(378, 123), (356, 15)], '100to150': [(100, 12), (112, 23), (145, 14)], '150to200': [(165, 34), (178, 45)], '200to250': [(227, 32), (234, 12)]}
你可以看到这样的东西: 使用字典存储分组值,以便稍后立即获取它们。
def categorize_by_first(pairs, step=50):
d = {}
for pair in pairs:
range_start = (pair[0] // step) * step
dict_key_name = f"{range_start}_{range_start + step}"
if not d.get(dict_key_name):
d[dict_key_name] = []
d[dict_key_name].append(pair)
return d
输出:
{'350_400': [(378, 123), (356, 15)],
'100_150': [(100, 12), (112, 23), (145, 14)],
'150_200': [(165, 34), (178, 45)],
'200_250': [(227, 32), (234, 12)]}
分组的时间复杂度为 O(n)(我们只对输入列表进行一次迭代)。
getting element from a dictionary 的时间复杂度为 O(1)
所以这应该是有效的。