提问人:midoriya007 提问时间:1/30/2023 最后编辑:midoriya007 更新时间:1/30/2023 访问量:127
根据自定义条件订购嵌套列表
Order a nested list based on custom condition
问:
我有一个列表列表:
[[1, 0], [2, 1], [5, 4], [1, 3], [4, 1], [3, 2], [0, <NA>]]
具有第二个元素的列表将始终是嵌套列表中的第一个列表。
在随后的两个列表中,第一个列表的第一个元素应与第二个列表的第二个元素匹配。例如:、、<NA>
[0, <NA>]
[1, 0]
[2, 1]
生成的列表应涵盖原始列表中的所有元素。
预期输出:
[[0, <NA>], [1, 0], [2, 1], [3, 2], [1, 3], [4, 1], [5, 4]]
在这里,之后,我们也可以去;但这是错误的,因为我们无法涵盖原始列表中的所有元素。我在这里使用 Python 作为编程语言。任何帮助将不胜感激。请,谢谢。[1, 0]
[4, 1]
答:
0赞
arise21
1/30/2023
#1
此代码使用递归生成预期输出。
your_list = [[1, 0], [2, 1], [5, 4], [1, 3], [4, 1], [3, 2], [0, '<NA>']]
first_item = [x for x in your_list if x[1] == '<NA>'][0] # Assuming only one of '<NA>' exists
remaining_list = your_list.copy()
remaining_list.remove(first_item)
def get_custom_order(remaining_list, ordered_list):
work_copy = remaining_list.copy()
start_value = ordered_list[-1][0]
for item in remaining_list:
if item[1] == start_value:
ordered_list.append(item)
work_copy.remove(item)
get_custom_order(work_copy, ordered_list)
break
return ordered_list
ordered_list = get_custom_order(remaining_list, [first_item])
print(ordered_list)
但是,我的答案是不完整的。此代码仅因列表排序而起作用。它不能满足您对所有元素进行排序的要求。我会尝试解决这个问题并更新我的答案。
评论
0赞
midoriya007
1/30/2023
谢谢酋长的帮助!我也在研究解决方案。将保持更新发布。
2赞
ricardkelly
1/30/2023
#2
(将 your 换成 None)这将查找列表中访问所有元素的最长路径。<NA>
def sort_path(elements):
def f(prefix, seq):
# get the current element to match
curr = prefix[-1][0] if len(prefix) > 0 else None
# get possible next nodes in path
next = [x for x in seq if x[1] == curr]
# get candidate paths from each next node
candidates = [f(prefix + [n], [x for x in seq if x != n]) for n in next]
# return the longest path from the candidates (or the prefix if no candidates)
return prefix if len(candidates) == 0 else max(candidates, key=len)
result = f([], elements)
return result if len(result) == len(elements) else None
input = [[1, 0], [2, 1], [5, 4], [1, 3], [4, 1], [3, 2], [0, None]]
print(sort_path(input))
# gives: [[0, None], [1, 0], [2, 1], [3, 2], [1, 3], [4, 1], [5, 4]]
评论
<NA>
"<NA>"
None