Python 3.x 减少或映射元组列表
我需要通过保留下一个元组中不存在的元组元素,将元组列表缩减为整数列表 所以我希望得到Python 3.x 减少或映射元组列表,python-3.x,Python 3.x,我需要通过保留下一个元组中不存在的元组元素,将元组列表缩减为整数列表 所以我希望得到[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 第3
[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
第3行,在
打印(列表(itertools.accumulate(lis,λa,b:a[0],如果b中有a[1],则b:a[1]))
TypeError:“int”对象不可下标
如果您不想使用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]
从
累积()的文档中
参数:p[,func]
结果:p0,p0+p1,p0+p1+p2
示例:累加([1,2,3,4,5])-->1 3 6 10 15
因此,对于问题列表中的代码(itertools.accumulate(lis,lambda a,b:a[0],如果b中的a[1]或者a[1]))
- 函数的第一个参数是前两个元组,即
a=(31,61)和b=(61,79)
给出第一个结果31
- 现在,函数的下一个参数是
a=31
和b=(29,79)
现在你可以明白为什么你会出错了
要解决您的问题,您可以尝试
[a[0]如果a[1]在b中,则a[1]在a中,b在zip中(lis[:-1],lis[1:])]+列表(lis[-1]如果lis[-2][0]在lis[-1]中,则lis[-2])
这与JavaScript reduce具有相同的API,当您从回调返回整数时,将累加器视为元组是没有意义的。因此a
是acummulator吗?然后我只需要将他的最后一个值与b
进行比较,对吗?我建议打印出参数来探索这种行为。您的任务既不适用于map(仅适用于一个元素),也不适用于reduce(输出必须与两个输入具有相同的类型)。为什么要使用这些呢?OP希望保留的项不只是相邻的元组,而不是之前的任何元组。如果后一个元组包含前一个元组中存在的项,则此解决方案将导致项丢失。确实如此。试试[(31,61)、(61,79)、(79,31)]
。预期的结果应该是[31,61,79,31]
,但您的解决方案将导致[31,61,79]
@blhsing-Oh我明白您的意思,我认为OP请求原始元组列表中的唯一
元素。也许我们应该等待进一步的澄清。我认为OP的意图从OP的“保留下一个元组中不存在的元组元素”的措辞和样本输入的结构方式都非常清楚,每个元组中的一个项总是与它前面的元组中的一个项相同。@blhsing我认为引用的表达式只是另一种说法,他希望最后的列表中不存在重复项。也许你是对的,如果他接受你的回答,我会删除我的,这听起来怎么样?
[31, 61, 79, 29, 103]