Python 迭代元组列表并根据条件创建字典

Python 迭代元组列表并根据条件创建字典,python,tuples,Python,Tuples,假设我有这样一个元组列表: t = [('one', 2), ('one', 4), ('one',9), ('two', 3), ('two', 5), ('two', 7), ('one', 11), ('one', 13), ('one', 14), ('one', 17), ('one', 19)] 如何获得下一个输出: out = [{'no':'one', 'first':2, 'last':9}, {'no':'two', 'first':3, 'last':7},

假设我有这样一个元组列表:

t = [('one', 2), ('one', 4), ('one',9), ('two', 3), ('two', 5), ('two', 7), ('one', 11), ('one', 13), ('one', 14), ('one', 17), ('one', 19)]
如何获得下一个输出:

out = [{'no':'one', 'first':2, 'last':9},
      {'no':'two', 'first':3, 'last':7},
      {'no':'one', 'first':11, 'last':19}]
整体情况如下: 对于每组相等的第一个元素,仅保留组中第一个和最后一个元素的值

from itertools import groupby
from operator import itemgetter

out = [
    {'no': k, 'first': a, 'last': b}
    for k, ((_, a), *_, (_, b)) in groupby(t, key=itemgetter(0))
]
如果有任何组只有一个连续元素,则上述操作将失败;要使其在这种情况下工作,可以执行以下操作:

从itertools导入groupby 从运算符导入itemgetter def手柄组,v: _,first=nextv 尝试: *_,u,last=v 除值错误外: 最后一个=第一个 返回{'no':k,'first':first,'last':last} out=[ 处理组,v 对于groupbyt中的k,v,key=itemgetter0 ]
使用Walrus操作符Python3.8+简化kaya3,即使只有一个连续元素也可以工作

from itertools import groupby
from operator import itemgetter

[{'no':k, 
  'first': (p:=list(v))[0][1], 
  'last':   p[-1][1]} 
  for k, v in groupby(t, itemgetter(0))]

如果您想在不导入任何模块的情况下编写它,下面是一个算法:

t = [('one', 2), ('one', 4), ('one', 9), ('two', 3), ('two', 5), ('two', 7),
     ('one', 11), ('one', 13), ('one', 14), ('one', 17), ('one', 19)]

res = [{'no': t[0][0], 'first': t[0][1], 'last': t[0][1]}]

for item in t[1:]:
    last_item_res = res[-1]
    if last_item_res['no'] == item[0]:

        if item[1] < last_item_res['first']:
            last_item_res['first'] = item[1]

        elif item[1] > last_item_res['last']:
            last_item_res['last'] = item[1]
    else:
        res.append({'no': item[0], 'first': item[1], 'last': item[1]})

for i in res:
    print(i)
我将第一项放在列表中,然后开始比较下一项的最小值和最大值