将嵌套列表转换为嵌套链接列表

时间:2013-09-20 14:00:43

标签: python

我有一个嵌套列表,如:

[['a', 'b'], ['c', 'd'], ['q', 'r'], ['z', 'a'], ['r', 's'], ['b', 'c']]

如果它是 6x2 数组,则任何一列中都不会有重复的元素。

我希望通过将每个子列表的第一个(最后一个)元素与不同子列表的最后一个(第一个)最后一个元素进行匹配来尽可能地组合子列表,所以我最终会得到类似

的内容。
[['z', 'a', 'b', 'c', 'd'], ['q', 'r', 's']]

在这个例子中,我使用字母来表示元素,但在我真正的问题中,实际上没有订单关系;例如,我不能说'a' < 'b'

我可以用一个丑陋的while循环来做到这一点,但我希望有一种pythonic方式来做它。

2 个答案:

答案 0 :(得分:3)

svk的稍快/更清洁的版本;

def nested_linked(link_pairs):
    mapping = dict(link_pairs)
    linkss = []

    # Python2: for link in mapping.viewkeys() - mapping.viewvalues():
    for link in mapping.keys() - mapping.values():
        links = [link]

        while link in mapping:
            link = mapping[link]
            links.append(link)

        linkss.append(links)

    return linkss

答案 1 :(得分:2)

我认为在Python中最直接的方法是使用显式while循环,但我认为它不一定非常难看:

def nested_linked(l):
    d = {a: b for a,b in l}
    rv = []
    while d:
        k = [k for k in d.keys() if k not in d.values()][0]
        rrv = [ k ]
        while k in d:
            nk = d[k]
            del d[k]
            k = nk
            rrv.append( nk )
       rv.append( rrv )
   return rv

(由于您的示例是6x2,因此未进行优化 - 如果您的实际数据要大得多并且这可能是瓶颈,那么您应该以更有效的方式明确地进行初始键选择。)