Python 3.x 创建';工会';其他列表的元素

Python 3.x 创建';工会';其他列表的元素,python-3.x,dictionary,reduce,Python 3.x,Dictionary,Reduce,我对编程还是有点生疏,遇到了一个绊脚石 我有一个列表列表,我想合并嵌套列表中具有相似元素的元素 名单: x = [[25, 26],[26, 27],[27, 28],[32, 33],[33, 34],[40, 41],[61, 62],[62, 63],[63, 64]] 我正在寻找的输出: [[25,26,27,28],[32,33,34],[40,41],[61,62,63,64]] 我用lambda函数map、reduce和map-reduce用了几种不同的方法来处理这个问

我对编程还是有点生疏,遇到了一个绊脚石

我有一个列表列表,我想合并嵌套列表中具有相似元素的元素

名单:

    x = [[25, 26],[26, 27],[27, 28],[32, 33],[33, 34],[40, 41],[61, 62],[62, 63],[63, 64]]
我正在寻找的输出:

[[25,26,27,28],[32,33,34],[40,41],[61,62,63,64]]
我用lambda函数map、reduce和map-reduce用了几种不同的方法来处理这个问题

  • 我尝试过使用交集使用lambda函数进行映射,但它不能捕获2以上的所有元素。即x[0]与x[2]没有交点

  • MapReduce只给了我第一个集合和最后一个索引,我可以对它进行迭代,但它看起来非常麻烦,它还跳过了没有类似相交子列表的子列表。(下面的例子)

输出:

(3, {25, 26, 27, 28})

任何帮助都将不胜感激,谢谢

我认为对于这类问题,命令式解决方案是最直接的,而不是试图用理解或高阶函数来解决

下面是一个构建列表列表的解决方案。每次我们看到一对新的
[x,y]
,检查
x
是否在当前列表的末尾。如果是,则将
y
附加到该列表中;否则,用
x
y
开始一个新列表

def join_对(对):
out=[]
对于成对的x、y:
如果out和out[-1][1]==x:
out[-1]。追加(y)
其他:
out.append([x,y])
返回
例如:

>成对=[
...     [25, 26], [26, 27], [27, 28], [32, 33], [33, 34],
...     [40, 41], [61, 62], [62, 63], [63, 64]
... ]
>>>连接双(对)
[[25, 26, 27, 28], [32, 33, 34], [40, 41], [61, 62, 63, 64]]
正如Jon Kiparsky在评论中指出的,您的示例中的对是方便的相邻和顺序的。以上的解决方案取决于此;如果不是所有输入数据都是这样,则需要先进行排序:

对于x,y进行排序(对于p成对排序(p)):
# ...

第一个问题:“相似”是一个模糊的术语。看起来你们指的是[[a,b],[b,c]]形式的成对,其中c-b==b-a==1。这是正确的吗?如果没有,您能定义“相似”吗?第二个问题:当您呈现数据时,要组合的子列表都是相邻的和顺序的。我们是否可以假定这通常是正确的,或者我们应该解释成对的任意顺序?嗨!是的,谢谢你的电话。所有子列表都将按顺序排列。它们实际上是另一个文本行列表的索引,需要按顺序组合。要合并的子列表将彼此相邻,通过“相似”,我的意思是前面的元素x[n+1][0]==x[n][1],当合并时,每个子列表将是一个唯一序列号的列表。在这种情况下,在我看来,您的第一步将是丢弃每对中的第二个元素,因为这只是分散注意力,这将为您提供一个类似于
[25、26、27、32、33、40、61、62、63]
的列表。现在您只需要在不连续点将其划分为子列表,并在每个子列表的末尾添加一个额外的“页面”。可能有一种可爱的方法可以使用高阶函数(即itertools)实现这一点,但它也是一个简单的函数,可以编写。或者,从概念上来说,更简单的方法是,将列表展平,对其进行设置,并对结果进行排序。这当然不会更有效,但它很可能会产生更清晰的代码,这通常更重要。谢谢你,它可以工作!问题-在if语句中。“out”是列表“至今”,您正在将列表“至今”和最后一个列表中的最后一个数字与要检查的下一对中的第一个数字进行比较。这难道不应该等同于真的吗?也就是说,“[[25,26,27,28],[32,33]]”和“33”==“33”…对吗?我是说。。它可以工作,但为什么呢?
的优先级低于
=
——读起来就像
如果(out)和(out[-1][-1]==x):
。第一部分只是检查列表中是否有任何内容,否则
out[-1]
将成为索引器。
(3, {25, 26, 27, 28})