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

Python 将嵌套列表转换为嵌套链接列表,python,Python,我有一个嵌套列表,如: [['a', 'b'], ['c', 'd'], ['q', 'r'], ['z', 'a'], ['r', 's'], ['b', 'c']] 如果它是一个6x2数组,则两列中都不会有重复的元素 我希望通过将每个子列表的第一个(最后一个)元素与不同子列表的最后一个(第一个)元素相匹配,尽可能地组合子列表,因此我最终会得到如下结果 [['z', 'a', 'b', 'c', 'd'], ['q', 'r', 's']] 在这个例子中,我用字母来表示元素,但在我真正的问

我有一个嵌套列表,如:

[['a', 'b'], ['c', 'd'], ['q', 'r'], ['z', 'a'], ['r', 's'], ['b', 'c']]
如果它是一个6x2数组,则两列中都不会有重复的元素

我希望通过将每个子列表的第一个(最后一个)元素与不同子列表的最后一个(第一个)元素相匹配,尽可能地组合子列表,因此我最终会得到如下结果

[['z', 'a', 'b', 'c', 'd'], ['q', 'r', 's']]
在这个例子中,我用字母来表示元素,但在我真正的问题中,实际上没有顺序关系;e、 例如,我不能说
'a'


我可以用丑陋的while循环来实现这一点,但我希望用Python的方式来实现。

我认为在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,所以未进行优化——如果您的实际数据大得多,这可能是一个瓶颈,那么您应该以更有效的方式进行初始键选择。)

我认为在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,因此未进行优化——如果您的实际数据大得多,这可能是一个瓶颈,您应该以更高效的方式进行初始密钥选择。)

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

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

我很困惑。你是想将每个列表与下一个列表进行比较,还是想将其与“abc”进行比较?如果这是第一件事,那么我不明白你怎么能知道哪个匹配到哪个子列表。如果这样写的话,他想做的事情会更清楚:
[[z a][a b][b c][c d][q r][r s]
会变成
[[z a b c d][q r s]
。你的元素是可哈希的还是不可修改的?(也就是说,它们可以用作字典键吗?)是的,它们是字符串。可能与我混淆了。你是想将每个列表与下一个列表进行比较,还是想将其与“abc”进行比较?如果这是第一件事,那么我不明白你怎么能知道哪个匹配到哪个子列表。如果这样写的话,他想做的事情会更清楚:
[[z a][a b][b c][c d][q r][r s]
会变成
[[z a b c d][q r s]
。你的元素是可哈希的还是不可修改的?(也就是说,它们可以用作字典键吗?)是的,它们是字符串。我猜
mapping.viewkeys()
的可能重复应该是
mapping.iterkeys()
?不
.iterkeys
是非常无用的,顺便说一句。它在Python3中被扔掉了,
.viewkeys
变成了
.keys
。嗯,我不知道这件事。谢谢尽管您应该注意到它只适用于Python2.7,但我想
mapping.viewkeys()
应该是
mapping.iterkeys()
?不
.iterkeys
是非常无用的,顺便说一句。它在Python3中被扔掉了,
.viewkeys
变成了
.keys
。嗯,我不知道这件事。谢谢尽管您应该注意到它只适用于Python2.7