减少或映射元组列表



我需要通过保留下一个元组中不存在的元组元素,将元组列表缩减为整数列表

import itertools
lis = [(31, 61), (61, 79), (29, 79), (29, 103)]
print(list(itertools.accumulate(lis, lambda a,b : a[0] if a[1] in b else a[1])))

所以我希望得到[31, 61, 79, 29, 103],但我遇到了这个异常
我做错了什么?有别的办法吗?

line 3, in <lambda>  
print(list(itertools.accumulate(lis, lambda a,b : a[0] if a[1] in b else a[1]))) 
TypeError: 'int' object is not subscriptable

如果您不想使用OrderedDict,因为外观顺序对您来说并不重要,请使用set()而不是OrderedDict.from()键,并删除第二个导入语句。

import itertools
from collections import OrderedDict
# List of tuple initialization 
lis = [(31, 61), (61, 79), (29, 79), (29, 103)]
# Using itertools as requested.
unique = list(OrderedDict.fromkeys(itertools.chain.from_iterable(lis)))
print(unique)

运行时输出:

[31, 61, 79, 29, 103]

您可以使用functools.reduce代替:

from functools import reduce
reduce(lambda a, b: [*a, *(i for i in b if i != a[-1])], lis)

返回:

[31, 61, 79, 29, 103]

accumulate()的文档中,

参数:p[,func]

结果:p0,p0+p1,p0+p1+p2,。。。

示例:累加([1,2,3,4,5](-->1 3 6 10 15

因此,对于问题list(itertools.accumulate(lis, lambda a,b : a[0] if a[1] in b else a[1]))中的代码

  • 函数的第一个参数是前两个元组,即a = (31, 61) and b = (61, 79),给出第一个结果31
  • 现在函数的下一个参数是a = 31b = (29, 79)

现在您可以看到为什么会出现错误了。

要解决您的问题,您可以尝试,


[a[0] if a[1] in b else a[1] for a,b in zip(lis[:-1], lis[1:])] + list(lis[-1] if lis[-2][0] in lis[-1] else lis[-2])

最新更新