我需要通过保留下一个元组中不存在的元组元素,将元组列表缩减为整数列表
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 = 31
和b = (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])