Python 将列表列表重新格式化为另一个列表列表

Python 将列表列表重新格式化为另一个列表列表,python,list,Python,List,我有一份清单: [['X', 'AX'],['X', 'XG'],['XG', 'AXG'],['AX', 'CAX'],['XG', 'XGG'],['AX', 'AXG']] 我想得到 [['X', 'AX', 'AXG'], ['X', 'XG', 'AXG'], ['X', 'XG', 'XGG'], ['X', 'AX', 'CAX']] 因此,从['X',AX']和['AX',CAX']我想得到['X',AX',CAX'],其中第一个列表的第二个元素是第二个列表的第一个元素 有没

我有一份清单:

[['X', 'AX'],['X', 'XG'],['XG', 'AXG'],['AX', 'CAX'],['XG', 'XGG'],['AX', 'AXG']]
我想得到

[['X', 'AX', 'AXG'], ['X', 'XG', 'AXG'], ['X', 'XG', 'XGG'], ['X', 'AX', 'CAX']]
因此,从
['X',AX']
['AX',CAX']
我想得到
['X',AX',CAX']
,其中第一个列表的第二个元素是第二个列表的第一个元素


有没有可能实现它?

只是一个简单的实现

您可以将其简化为一维对象数组(在本例中为
list()
),并将从第一个元素开始的对象与下一个元素进行比较

只需选择第一个元素并将其与条件的所有下一个元素匹配,然后选择第二个元素并将其与下一个元素匹配,依此类推

在这里,我们对对象的条件是第一个对象的索引1等于第二个对象的索引1,所以您将这样实现它-

l = [['X', 'AX'],['X', 'XG'],['XG', 'AXG'],['AX', 'CAX'],['XG', 'XGG'],['AX', 'AXG']]
l1 = list()
for i in range(len(l)):
    for j in range(i+1, len(l)):
        if l[i][1] == l[j][0]:
            l1.append(l[i]+[l[j][1]])

print "l1 = %r"%l1

Output: l1 = [['X', 'AX', 'CAX'], ['X', 'AX', 'AXG'], ['X', 'XG', 'AXG'], ['X', 'XG', 'XGG']]

这是我过于复杂的实现,它完全避免了
range()
,我觉得它在一种声称是高级语言的语言中被过度使用,但却滥用了
reduce()

from functools import reduce
from itertools import takewhile, dropwhile

array = [['X', 'AX'], ['X', 'XG'], ['XG', 'AXG'], ['AX', 'CAX'], ['XG', 'XGG'], ['AX', 'AXG']]

def partition(predicate, array):
    return list(takewhile(predicate, array)), dropwhile(predicate, array)

def reducer(accumulated, update):

    for solution in accumulated:
        if solution[-1] == update[0]:
            accumulated.append(solution + update[1:])

    return accumulated

min_length = len(array[0][0])

heads, tails = partition(lambda x: len(x[0]) == min_length, array)

reduction = reduce(reducer, tails, heads)

max_length = len(reduction[-1])

print(list(dropwhile(lambda x: len(x) != max_length, reduction)))
输出

[['X', 'XG', 'AXG'], ['X', 'AX', 'CAX'], ['X', 'XG', 'XGG'], ['X', 'AX', 'AXG']]
如果我们将输入更改为:

array = [['X', 'AX'], ['AX', 'CAX'], ['AX', 'AXG'], ['CAX', 'XYZ'], ['CAX', 'ABC'], ['AXG', 'DEF'], ['AXG', 'MNO']]
我们得到了预期的输出:

[['X', 'AX', 'CAX', 'XYZ'], ['X', 'AX', 'CAX', 'ABC'], ['X', 'AX', 'AXG', 'DEF'], ['X', 'AX', 'AXG', 'MNO']]

但我怀疑OP规范中没有适当涵盖输入的几种潜在异常情况。

您是如何从第一个列表转换到第二个列表的?您能解释一下第一个列表如何转换为第二个列表吗?从['X',AX']和['AX',CAX']获得['X',AX',CAX'],第一个列表的第二个元素是第二个列表的第一个元素。现在还不清楚,您想要什么。如果你不能制定一个清晰的英语句子,为什么你要我们破译你的愿望,然后代替你执行你的任务?这不符合比例。如果我提供输入
[['X',AX'],['AX',CAX'],['AX',AXG'],['CAX',XYZ'],['CAX',ABC'],['AXG',DEF'],['AXG',MNO']
我会得到六组三人,而不是预期的四组四人。这可能是一个简单的修复。正确,但代码按照预期的输出工作,在您的情况下,我的代码将失败,代码可以根据预期输出的类型进行重构,我只是想告诉您如何获取对象并比较它们。非常感谢,这正是我需要的!我想我不知道如何用英语表达句子,但你明白我的意思,你能给我解释一下这句话是怎么说的吗?减速=减速(减速器、尾部、头部)。reducer是一个函数,应该有两个参数-累计、更新。@uzver,在每次迭代中,
reducer()
被交给“到目前为止的解决方案”和“要集成到该解决方案中的另一个元素”。正如我所指出的,我稍微弯曲了
reduce()
的概念,以使这项工作能够展示思考这个问题的多种方法之一。我相信可能会有更好的解决方案,但在确定“正确”的方法之前,您确实需要确定此转换的规则(例如,如果扩展的长度不都相同怎么办?数据是否总是以方便的顺序开始,或者是否可以被洗牌?)。