通过匹配元素对子列表进行排序

时间:2019-05-26 01:29:10

标签: python python-2.7

我有一个如下列表:

lst1 = [[5, 0], [5, 3], [6, 2], [6, 1], [4, 0], [4, 1], [4, 3], [7, 2], [7, 1], [7, 3], [0, 3], [2, 1], [3, 8]]

我想创建一个如下列表:

lst2 = [[5, 0, 3, 8], [6, 2, 1], [4, 0, 3, 8], [7, 2, 1], [5, 3, 8]]

[5, 0, 3, 8]是根据[5, 0][0, 3][3, 8]创建的,因为[5, 0]的最后一项与[0, 3]的第一项匹配[0, 3]的最后一项与[3, 8]的第一个元素匹配。同样,[6, 2, 1]来自[6, 2][2, 1],依此类推。问题是如何迭代lst1并创建lst2?我知道如何迭代列表/列表,提取项目等,但是我遇到的困难是如何一次lst1迭代一次lst2

1 个答案:

答案 0 :(得分:0)

好吧,我可以遍历顶层循环“一次”,但实际上并不是“一次”,因为每次迭代都会遍历其子列表。 O(n ^ 2),如果我没记错的话:

lst1 = [[5, 0], [5, 3], [6, 2], [6, 1], [4, 0], [4, 1], [4, 3], [7, 2], [7, 1], [7, 3], [0, 3], [2, 1], [3, 8]]


def accept(root, pair):
    if root[-1] == pair[0]:
        root.append(pair[1])


def longest_for_root(root, pairs):
    for i, pair in enumerate(pairs):
        accept(root, pairs[i])


def strings_for_list(pairs):
    for i, pair in enumerate(pairs):
        if i < len(pairs) - 1:
            lfr = pairs[i].copy()
            longest_for_root(lfr, pairs[i + 1:])
            if len(lfr) > 2:
                yield lfr

[*strings_for_list(lst1)]

# [[5, 0, 3, 8], [5, 3, 8], [6, 2, 1], [4, 0, 3, 8], [4, 3, 8], [7, 2, 1], [7, 3, 8], [0, 3, 8]]

出现的另一种选择是将条目放在dict中,并以它们的首字母和结尾数字为键,但是我认为只是改变accept()的样子。

我假设您正在按顺序查找匹配项,这意味着[[5,0],[0,3]]会产生[5, 0, 3],而[[0,3],[5,0]]却什么也不会产生。

相关问题