2

我有一个嵌套列表,例如:

[['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的方式来做到这一点。

4

2 回答 2

3

A slightly faster/cleaner version of svk's;

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
于 2013-09-20T14:46:19.310 回答
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,因此未优化 - 如果您的实际数据更大并且这可能是一个瓶颈,您应该清楚地以更有效的方式进行初始键选择。)

于 2013-09-20T14:15:47.710 回答