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)
我将第一项放在列表中,然后开始比较下一项的最小值和最大值