Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 减少或映射元组列表_Python 3.x - Fatal编程技术网

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]