我有一个嵌套列表,如:
[['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方式来做它。
答案 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,因此未进行优化 - 如果您的实际数据要大得多并且这可能是瓶颈,那么您应该以更有效的方式明确地进行初始键选择。)