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

2024-09-28 14:55:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我试图过滤列表,以删除每个事件(tuple的第三个成员)的最小和最大时间值(tuple中的第一个项目)。我试着用列表理解法,但很快就搞糊涂了。在

('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')

过滤后的结果为

^{pr2}$

我正在尝试下面的代码,但我得到一个错误。我是相当新的,所以请告诉我,如果我做了一些不正确的事情。代码中的m1是我从findall生成的元组列表。我在代码的顶部导入了ast。在

       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))

Tags: in元素列表for元组ftvoltagem1
3条回答

这是可行的(只要您确实有一个第一个值为float的元组列表):

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))

印刷品:

^{pr2}$

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

import ast

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

将元组重构为dict可以使工作更轻松。在

from collections import defaultdict

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

之后,d为每个事件提供一个键,以及该时间段的关联时间列表。在

它看起来像这样(有点):

^{pr2}$

现在的问题是找到每个列表的最小值和最大值;使用min()max()很容易

一旦运行完这个过程,就可以按照您想要的顺序设置数据;并且可以将其转换回tuple/list/etc

如果你想把这个列表转换成一个set,这样可以消除重复时间,并通过加快min/max来节省一些时间;假设这是一个需要计算的元组的大列表。在

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

为此使用itertools.groupby

>>> 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. 最小值/最大值按顺序对元组的元素执行。但是,第一个元素实际上是一个字符串而不是一个float,因此您可能需要将key参数传递给min和max,使其使用不同的值
  2. 只有当分组键的所有相同值都在列表中时,这才有效。在示例输出中,情况就是这样,但如果不是,则可能必须首先对列表进行排序。在

相关问题 更多 >