Ale*_*x M 2 python tuples list subset
我有一个元组列表如下:
data = [
('A', '59', '62'), ('A', '2', '6'), ('A', '87', '92'),
('A', '98', '104'), ('A', '111', '117'),
('B', '66', '71'), ('B', '25', '31'), ('B', '34', '40'), ('B', '46', '53'),
('B', '245', '251'), ('B', '235', '239'), ('B', '224', '229'), ('B', '135', '140'),
('C', '157', '162'), ('C', '203', '208'),
('D', '166', '173'), ('D', '176', '183'),
('E', '59', '62'), ('E', '2', '6'), ('E', '87', '92'), ('E', '98', '104'), ('E', '111', '117')
]
Run Code Online (Sandbox Code Playgroud)
它们对应于较大数据集的子集,因此我如上所述进行了提取以简化此帖子.每个元组的第一个元素,即A,B,C,D,E ......是一个标识符,可以存在多个副本中.
我想提取每个ID /类别(A,B,C,D,E ...):
1 - 从元组的第2个元素开始最小化
2 - 元组的第3个元素的最大值
最终输出列表应如下所示:
A: min = 2, max = 117
B: min = 25, max = 251
C: min = 157, max = 208
D: min = 166, max = 183
E: min = 2, max = 117
Run Code Online (Sandbox Code Playgroud)
我尝试了一种基于这篇文章的方法:当订单很重要时,如何从元组列表中删除重复
我通过使用仅包含前2个元素的元组并仅提取最小元素来简化测试.
输出如下所示:
('A', '111')
('B', '135')
('C', '157')
('D', '166')
('E', '111')
Run Code Online (Sandbox Code Playgroud)
它应该是:
('A', '2')
('B', '25')
('C', '157')
('D', '166')
('E', '2')
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种可以使用完整的"三元组"示例的方法,以避免将数据拆分成多个子集.
非常感谢你的时间.
你好,
请参阅下面的编辑,其中包含之前未包含的代码段.这给出了帖子前一部分的错误最小值.
data_min_only = [('A', '59'), ('A', '2'), ('A', '87'), ('A', '98'), ('A', '111'), ('B', '66'), ('B', '25'), ('B', '34'), ('B', '46'), ('B', '245'), ('B', '235'), ('B', '224'), ('B', '135'), ('C', '157'), ('C', '203'), ('D', '166'), ('D', '176'), ('E', '59'), ('E', '2'), ('E', '87'), ('E', '98'), ('E', '111')]
from collections import OrderedDict
empty_dict = OrderedDict()
for item in data_min_only:
# Get old value in dictionary if exist
old = empty_dict.get(item[0])
# Skip if new item is larger than old
if old:
if item[1] > old[1]:
continue
else:
del d[item[0]]
# Assign
empty_dict[item[0]] = item
list(empty_dict.values())
Run Code Online (Sandbox Code Playgroud)
我在想每个类别的元组值的顺序是问题(在迭代之前应该是最小到最大)data_min_only.
感谢所有海报的快速回复和建议/解决方案!我正在努力通过这些来尝试和理解并进一步调整它们.
我调整了@slider建议来检索min和max之间的差异.我还尝试将结果输出到如下列表,但只显示最后的结果.
for k, g in groupby(sorted(data), key=lambda x: x[0]):
vals = [(int(t[1]), int(t[2])) for t in g]
print (max(i[1] for i in vals) - min(i[0] for i in vals))
test_lst = []
test_lst.append((max(i[1] for i in vals) - min(i[0] for i in vals)))
Run Code Online (Sandbox Code Playgroud)
我也尝试了这个,但结果相同:
for i in vals:
test_lst2 = []
test_lst2.append((max(i[1] for i in vals) - min(i[0] for i in vals)))
Run Code Online (Sandbox Code Playgroud)
对于这种循环,将结果提取到列表的最佳方法是什么?
再次感谢.
test_lst = []
for k, g in groupby(sorted(data), key=lambda x: x[0]):
vals = [(int(t[1]), int(t[2])) for t in g]
print (max(i[1] for i in vals) - min(i[0] for i in vals))
test_lst.append((max(i[1] for i in vals) - min(i[0] for i in vals)))
Run Code Online (Sandbox Code Playgroud)
提取循环数据的解决方案 - 空列表应该在循环之外.请参阅@slider评论,了解他的帖子如下.
您可以使用itertools.groupby"id"键首先分组,然后计算每个组的最小值和最大值:
from itertools import groupby
groups = []
for k, g in groupby(sorted(data), key=lambda x: x[0]):
groups.append(list(g))
for g in groups:
print(g[0][0], 'min:', min(int(i[1]) for i in g), 'max:', max(int(i[2]) for i in g))
Run Code Online (Sandbox Code Playgroud)
产量
A min: 2 max: 117
B min: 25 max: 251
C min: 157 max: 208
D min: 166 max: 183
E min: 2 max: 117
Run Code Online (Sandbox Code Playgroud)
请注意,您不必先将组存储在groups列表中; 你可以在groupbyfor循环中迭代时直接打印最小值和最大值:
for k, g in groupby(sorted(data), key=lambda x: x[0]):
vals = [(int(t[1]), int(t[2])) for t in g]
print(k, 'min:', min(i[0] for i in vals), 'max:', max(i[1] for i in vals))
Run Code Online (Sandbox Code Playgroud)