首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >过滤元组列表以包含max和min

过滤元组列表以包含max和min
EN

Stack Overflow用户
提问于 2012-09-07 00:40:02
回答 4查看 1.5K关注 0票数 3

我已经生成了一个很长的元组列表(格式如下)。列表中的每个元组都将time作为第一个元素,将一个事件作为第三个成员。第二个成员总是相同的,并从其他类似的列表中识别出我将不得不处理的列表。这些元组有许多不同的第三个元素,每个元素在不同的时间值上都有多个条目,这是第一个元素。

我正在尝试过滤列表,以删除每个事件(元组的第三个成员)的最小和最大时间值(元组中的第一项)之外的所有内容。我试着使用列表理解,但很快就被弄糊涂了。

代码语言:javascript
复制
('1.3433', 'VOLTAGE DEVIATION', 'DNLP2G23.575')
('1.3433', 'VOLTAGE DEVIATION', 'DNLP2G23.575')
('1.3433', 'VOLTAGE DEVIATION', 'DNLP2G23.575')
('1.3433', 'VOLTAGE DEVIATION', 'DNLP2G23.575')
('1.3433', 'VOLTAGE DEVIATION', 'DNLP2G23.575')
('1.3433', 'VOLTAGE DEVIATION', 'DNLP2G23.575')
('1.3433', 'VOLTAGE DEVIATION', 'DNLP2G23.575')
('1.3433', 'VOLTAGE DEVIATION', 'DNLP2G23.575')
('1.3433', 'VOLTAGE DEVIATION', 'DNLP2G23.575')
('1.3467', 'VOLTAGE DEVIATION', 'DNLP2G23.575')
('1.3467', 'VOLTAGE DEVIATION', 'DNLP2G23.575')
('1.3467', 'VOLTAGE DEVIATION', 'DNLP2G23.575')
('1.3467', 'VOLTAGE DEVIATION', 'DNLP1_G1.575')
('1.3467', 'VOLTAGE DEVIATION', 'DNLP1_G1.575')
('1.3467', 'VOLTAGE DEVIATION', 'DNLP1_G1.575')
('1.3467', 'VOLTAGE DEVIATION', 'DNLP1_G1.575')
('1.3533', 'VOLTAGE DEVIATION', 'DIFICULT 230')
('1.3533', 'VOLTAGE DEVIATION', 'DIFICULT 230')
('1.3533', 'VOLTAGE DEVIATION', 'DIFICULT 230')
('1.3533', 'VOLTAGE DEVIATION', 'DIFICULT 230')
('1.3533', 'VOLTAGE DEVIATION', 'DIFICULT 230')
('1.3533', 'VOLTAGE DEVIATION', 'DIFICULT 230')
('1.3533', 'VOLTAGE DEVIATION', 'DIFICULT 230')
('1.3533', 'VOLTAGE DEVIATION', 'DIFICULT 230')
('1.3533', 'VOLTAGE DEVIATION', 'DIFICULT 230')
('1.3567', 'VOLTAGE DEVIATION', 'DIFICULT 230')
('1.3600', 'VOLTAGE DEVIATION', 'DIFICULT 230')
('1.3600', 'VOLTAGE DEVIATION', '7MIHL G1.575')
('1.3600', 'VOLTAGE DEVIATION', '7MIHL G1.575')
('1.3600', 'VOLTAGE DEVIATION', '7MIHL G1.575')
('1.3600', 'VOLTAGE DEVIATION', '7MIHL G1.575')
('1.3600', 'VOLTAGE DEVIATION', '7MIHL G1.575')
('1.3600', 'VOLTAGE DEVIATION', '7MIHL G1.575')
('1.3600', 'VOLTAGE DEVIATION', '7MIHL G1.575')
('1.3600', 'VOLTAGE DEVIATION', '7MIHL G1.575')
('1.3600', 'VOLTAGE DEVIATION', '7MIHL G1.575')
('1.3600', 'VOLTAGE DEVIATION', '7MIHL G1.575')
('1.3800', 'VOLTAGE DEVIATION', '7MIHL G1.575')
('1.3800', 'VOLTAGE DEVIATION', '7MIHL G1.575')
('1.3800', 'VOLTAGE DEVIATION', 'HORIZ_G .575')
('1.3800', 'VOLTAGE DEVIATION', 'MEDBOWCO 115')
('1.3800', 'VOLTAGE DEVIATION', 'MEDBOWCO 115')
('1.3800', 'VOLTAGE DEVIATION', 'STNDPSVC 230')
('1.3800', 'VOLTAGE DEVIATION', 'STNDPSVC 230')
('1.3800', 'VOLTAGE DEVIATION', 'STNDPSVC 230')
('1.3800', 'VOLTAGE DEVIATION', 'STNDPSVC 230')
('1.3800', 'VOLTAGE DEVIATION', 'STNDPSVC 230')
('1.3800', 'VOLTAGE DEVIATION', 'STNDPSVC 230')
('1.3867', 'VOLTAGE DEVIATION', 'MINERS  34.5')
('1.3867', 'VOLTAGE DEVIATION', 'MINERS  34.5')
('1.3867', 'VOLTAGE DEVIATION', 'MINERS  34.5')
('1.3867', 'VOLTAGE DEVIATION', 'MINERS  34.5')
('1.3867', 'VOLTAGE DEVIATION', 'MINERS  34.5')
('1.3867', 'VOLTAGE DEVIATION', 'MINERS  34.5')
('1.3867', 'VOLTAGE DEVIATION', 'MINERS  34.5')
('1.3867', 'VOLTAGE DEVIATION', 'MINERS  34.5')
('1.3867', 'VOLTAGE DEVIATION', 'MINERS  34.5')
('1.3867', 'VOLTAGE DEVIATION', 'MINERS  34.5')
('1.3867', 'VOLTAGE DEVIATION', 'MINERS  34.5')
('1.3900', 'VOLTAGE DEVIATION', 'MINERS  34.5')
('1.3900', 'VOLTAGE DEVIATION', 'MINERS  34.5')
('1.3900', 'VOLTAGE DEVIATION', 'MINERS  34.5')
('1.3900', 'VOLTAGE DEVIATION', 'MINERS  34.5')
('1.3900', 'VOLTAGE DEVIATION', 'MINERS  34.5')
('1.3900', 'VOLTAGE DEVIATION', 'MINERS  34.5')
('1.3900', 'VOLTAGE DEVIATION', 'MINERS  34.5')
('1.3900', 'VOLTAGE DEVIATION', 'MINERS  34.5')
('1.3900', 'VOLTAGE DEVIATION', 'MINERS  34.5')
'1.4233', 'VOLTAGE DEVIATION', 'FT CRK2 34.5')
('1.4233', 'VOLTAGE DEVIATION', 'FT CRK2 34.5')
('1.4233', 'VOLTAGE DEVIATION', 'FT CRK2 34.5')
('1.4233', 'VOLTAGE DEVIATION', 'FT CRK2 34.5')
('1.4233', 'VOLTAGE DEVIATION', 'FT CRK2 34.5')
('1.4233', 'VOLTAGE DEVIATION', 'FT CRK2 34.5')
('1.4233', 'VOLTAGE DEVIATION', 'FT CRK2 34.5')
('1.4233', 'VOLTAGE DEVIATION', 'FT CRK2 34.5')
('1.4233', 'VOLTAGE DEVIATION', 'FT CRK2 34.5')
('1.4233', 'VOLTAGE DEVIATION', 'FT CRK2 34.5')
('1.4233', 'VOLTAGE DEVIATION', 'FT CRK2 34.5')
('1.4267', 'VOLTAGE DEVIATION', 'FT CRK2 34.5')
('1.4267', 'VOLTAGE DEVIATION', 'FT CRK2 34.5')
('1.4267', 'VOLTAGE DEVIATION', 'FT CRK2 34.5')
('1.4267', 'VOLTAGE DEVIATION', 'FT CRK2 34.5')
('1.4267', 'VOLTAGE DEVIATION', 'FT CRK2 34.5')
('1.4800', 'VOLTAGE DEVIATION', 'HIPLN_G .575')
('1.4800', 'VOLTAGE DEVIATION', 'HIPLN_G .575')
('1.4800', 'VOLTAGE DEVIATION', 'HIPLN_G .575')
('1.4800', 'VOLTAGE DEVIATION', 'HIPLN_G .575')
('1.4800', 'VOLTAGE DEVIATION', 'HIPLN_G .575')
('1.4800', 'VOLTAGE DEVIATION', 'HIPLN_G .575')
('1.4800', 'VOLTAGE DEVIATION', 'HIPLN_G .575')
('1.4800', 'VOLTAGE DEVIATION', 'HIPLN_G .575')
('1.4800', 'VOLTAGE DEVIATION', 'HIPLN_G .575')
('1.4833', 'VOLTAGE DEVIATION', 'HIPLN_G .575')
('1.4833', 'VOLTAGE DEVIATION', 'HIPLN_G .575')
('1.4833', 'VOLTAGE DEVIATION', 'HIPLN_G .575')
('1.4833', 'VOLTAGE DEVIATION', 'HIPLN_G .575')
('1.4833', 'VOLTAGE DEVIATION', 'HIPLN_G .575')

筛选后的结果为

代码语言:javascript
复制
('1.3433', 'VOLTAGE DEVIATION', 'DNLP2G23.575')
('1.3467', 'VOLTAGE DEVIATION', 'DNLP2G23.575')
('1.3467', 'VOLTAGE DEVIATION', 'DNLP1_G1.575')
('1.3467', 'VOLTAGE DEVIATION', 'DNLP1_G1.575')
('1.3533', 'VOLTAGE DEVIATION', 'DIFICULT 230')
('1.3600', 'VOLTAGE DEVIATION', 'DIFICULT 230')
('1.3600', 'VOLTAGE DEVIATION', '7MIHL G1.575')
('1.3800', 'VOLTAGE DEVIATION', '7MIHL G1.575')
('1.3800', 'VOLTAGE DEVIATION', 'HORIZ_G .575')
('1.3800', 'VOLTAGE DEVIATION', 'MEDBOWCO 115')
('1.3800', 'VOLTAGE DEVIATION', 'MEDBOWCO 115')
('1.3800', 'VOLTAGE DEVIATION', 'STNDPSVC 230')
('1.3800', 'VOLTAGE DEVIATION', 'STNDPSVC 230')
('1.3800', 'VOLTAGE DEVIATION', 'STNDPSVC 230')
('1.3867', 'VOLTAGE DEVIATION', 'MINERS  34.5')
('1.3900', 'VOLTAGE DEVIATION', 'MINERS  34.5')
'1.4233', 'VOLTAGE DEVIATION', 'FT CRK2 34.5')
('1.4267', 'VOLTAGE DEVIATION', 'FT CRK2 34.5')
('1.4800', 'VOLTAGE DEVIATION', 'HIPLN_G .575')
('1.4833', 'VOLTAGE DEVIATION', 'HIPLN_G .575')`

我正在尝试下面的代码,但我得到了一个错误。我是个新手,所以如果我做错了什么,请告诉我。代码中的m1是我从findall生成的元组列表。我已经在我的代码顶部导入了ast。

代码语言:javascript
复制
       m1 = re.findall(pattern1,wholefile)
       m1=[ast.literal_eval(t) for t in m1] 
       m1=[(float(a),b,c) for a,b,c in m1] 
       keys=sorted({t[2] for t in m1}) 
       for key in keys: 
           group=filter(lambda t: t[2]==key,m1)
           print '{}:\n\tmax: {}\n\tmin: {}'.format(key,max(group),min(group))
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-07 01:08:13

这是有效的(只要你真的有一个元组列表,第一个值是一个浮点数):

代码语言:javascript
复制
keys=sorted({t[2] for t in tups})
for key in keys:
    group=filter(lambda t: t[2]==key,tups)
    print '{}:\n\tmax: {}\n\tmin: {}'.format(key,max(group),min(group))

打印:

代码语言:javascript
复制
MIHL G1.575:
    max: (1.38, 'VOLTAGE DEVIATION', '7MIHL G1.575')
    min: (1.36, 'VOLTAGE DEVIATION', '7MIHL G1.575')
DIFICULT 230:
    max: (1.36, 'VOLTAGE DEVIATION', 'DIFICULT 230')
    min: (1.3533, 'VOLTAGE DEVIATION', 'DIFICULT 230')
DNLP1_G1.575:
    max: (1.3467, 'VOLTAGE DEVIATION', 'DNLP1_G1.575')
    min: (1.3467, 'VOLTAGE DEVIATION', 'DNLP1_G1.575')
DNLP2G23.575:
    max: (1.3467, 'VOLTAGE DEVIATION', 'DNLP2G23.575')
    min: (1.3433, 'VOLTAGE DEVIATION', 'DNLP2G23.575')
FT CRK2 34.5:
    max: (1.4267, 'VOLTAGE DEVIATION', 'FT CRK2 34.5')
    min: (1.4233, 'VOLTAGE DEVIATION', 'FT CRK2 34.5')
HIPLN_G .575:
    max: (1.4833, 'VOLTAGE DEVIATION', 'HIPLN_G .575')
    min: (1.48, 'VOLTAGE DEVIATION', 'HIPLN_G .575')
HORIZ_G .575:
    max: (1.38, 'VOLTAGE DEVIATION', 'HORIZ_G .575')
    min: (1.38, 'VOLTAGE DEVIATION', 'HORIZ_G .575')
MEDBOWCO 115:
    max: (1.38, 'VOLTAGE DEVIATION', 'MEDBOWCO 115')
    min: (1.38, 'VOLTAGE DEVIATION', 'MEDBOWCO 115')
MINERS  34.5:
    max: (1.39, 'VOLTAGE DEVIATION', 'MINERS  34.5')
    min: (1.3867, 'VOLTAGE DEVIATION', 'MINERS  34.5')
STNDPSVC 230:
    max: (1.38, 'VOLTAGE DEVIATION', 'STNDPSVC 230')
    min: (1.38, 'VOLTAGE DEVIATION', 'STNDPSVC 230')

根据你的评论,你的声音确实有看起来像元组的文本。因此,要将其转换为实际的元组:

代码语言:javascript
复制
import ast

tups=[ast.literal_eval(t) for t in tups]
tups=[(float(a),b,c) for a,b,c in tups]
票数 1
EN

Stack Overflow用户

发布于 2012-09-07 00:47:10

将你的元组重构成一个字典会让事情变得更容易。

代码语言:javascript
复制
from collections import defaultdict

d = defaultdict(list)
for t,_,v in your_tuple_list:
     d[v].append(t)

在此之后,d为每个事件提供了一个键,并列出了该时间段的相关时间。

它将看起来像这样(某种程度上):

代码语言:javascript
复制
>>> d['DNLP2G23.575']
['1.3433'....]

现在问题变成了寻找每个列表的最小和最大值;使用min()max()很容易做到这一点

一旦你遍历了它,你就会得到你想要的顺序的数据集;你可以把它转换回一个元组/列表/等等。

如果你很热衷,你可以把这个列表转换成一个set,这将消除重复的时间,并通过加快最小/最大来节省你的时间;假设它是你必须计算的一个大的元组列表。

您还应该将您的时间转换为float -您可以在主循环:d[v].append(float(t))中执行此操作。这是为了确保最大值和最小值正常工作。

票数 4
EN

Stack Overflow用户

发布于 2012-09-07 00:51:33

使用itertools.groupby实现以下目标:

代码语言:javascript
复制
>>> import itertools
>>> import operator
>>> results = []
>>> for key, group in itertools.groupby(tuplelist, operator.itemgetter(2)):
...    group = list(group)
...    results.append(min(group))
...    results.append(max(group))
...
>>> pprint.pprint(results)
[('1.3433', 'VOLTAGE DEVIATION', 'DNLP2G23.575'),
 ('1.3467', 'VOLTAGE DEVIATION', 'DNLP2G23.575'),
 ('1.3467', 'VOLTAGE DEVIATION', 'DNLP1_G1.575'),
 ('1.3467', 'VOLTAGE DEVIATION', 'DNLP1_G1.575'),
 ('1.3533', 'VOLTAGE DEVIATION', 'DIFICULT 230'),
 ('1.3600', 'VOLTAGE DEVIATION', 'DIFICULT 230'),
 ('1.3600', 'VOLTAGE DEVIATION', '7MIHL G1.575'),
 ('1.3800', 'VOLTAGE DEVIATION', '7MIHL G1.575'),
 ('1.3800', 'VOLTAGE DEVIATION', 'HORIZ_G .575'),
 ('1.3800', 'VOLTAGE DEVIATION', 'HORIZ_G .575'),
 ('1.3800', 'VOLTAGE DEVIATION', 'MEDBOWCO 115'),
 ('1.3800', 'VOLTAGE DEVIATION', 'MEDBOWCO 115'),
 ('1.3800', 'VOLTAGE DEVIATION', 'STNDPSVC 230'),
 ('1.3800', 'VOLTAGE DEVIATION', 'STNDPSVC 230'),
 ('1.3867', 'VOLTAGE DEVIATION', 'MINERS  34.5'),
 ('1.3900', 'VOLTAGE DEVIATION', 'MINERS  34.5'),
 ('1.4233', 'VOLTAGE DEVIATION', 'FT CRK2 34.5'),
 ('1.4267', 'VOLTAGE DEVIATION', 'FT CRK2 34.5'),
 ('1.4800', 'VOLTAGE DEVIATION', 'HIPLN_G .575'),
 ('1.4833', 'VOLTAGE DEVIATION', 'HIPLN_G .575')]

备注:

  1. 最小/最大值是在元组的元素上按顺序完成的。但是,第一个元素实际上是一个字符串,而不是一个浮点数,因此您可能需要将key参数传递给min和max,以使其使用不同的值
  2. 。只有当分组的键的所有相同值都在列表中时,此方法才有效。在您的示例输出中,情况就是这样,但如果不是这样,您可能必须首先对列表进行排序。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12304587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档