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