我有一个如下列表:
lst1 = [[5, 0], [5, 3], [6, 2], [6, 1], [4, 0], [4, 1], [4, 3], [7, 2], [7, 1], [7, 3], [0, 3], [2, 1], [3, 8]]
我想创建一个如下列表:
lst2 = [[5, 0, 3, 8], [6, 2, 1], [4, 0, 3, 8], [7, 2, 1], [5, 3, 8]]
[5, 0, 3, 8]
是根据[5, 0]
,[0, 3]
和[3, 8]
创建的,因为[5, 0]
的最后一项与[0, 3]
的第一项匹配[0, 3]
的最后一项与[3, 8]
的第一个元素匹配。同样,[6, 2, 1]
来自[6, 2]
和[2, 1]
,依此类推。问题是如何迭代lst1
并创建lst2
?我知道如何迭代列表/列表,提取项目等,但是我遇到的困难是如何一次lst1
迭代一次lst2
。
答案 0 :(得分:0)
好吧,我可以遍历顶层循环“一次”,但实际上并不是“一次”,因为每次迭代都会遍历其子列表。 O(n ^ 2),如果我没记错的话:
lst1 = [[5, 0], [5, 3], [6, 2], [6, 1], [4, 0], [4, 1], [4, 3], [7, 2], [7, 1], [7, 3], [0, 3], [2, 1], [3, 8]]
def accept(root, pair):
if root[-1] == pair[0]:
root.append(pair[1])
def longest_for_root(root, pairs):
for i, pair in enumerate(pairs):
accept(root, pairs[i])
def strings_for_list(pairs):
for i, pair in enumerate(pairs):
if i < len(pairs) - 1:
lfr = pairs[i].copy()
longest_for_root(lfr, pairs[i + 1:])
if len(lfr) > 2:
yield lfr
[*strings_for_list(lst1)]
# [[5, 0, 3, 8], [5, 3, 8], [6, 2, 1], [4, 0, 3, 8], [4, 3, 8], [7, 2, 1], [7, 3, 8], [0, 3, 8]]
出现的另一种选择是将条目放在dict
中,并以它们的首字母和结尾数字为键,但是我认为只是改变accept()
的样子。
我假设您正在按顺序查找匹配项,这意味着[[5,0],[0,3]]
会产生[5, 0, 3]
,而[[0,3],[5,0]]
却什么也不会产生。