根据自定义条件订购嵌套列表

Order a nested list based on custom condition

提问人:midoriya007 提问时间:1/30/2023 最后编辑:midoriya007 更新时间:1/30/2023 访问量:127

问:

我有一个列表列表:

[[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]

Python 列表 排序 嵌套列表

评论

1赞 mkrieger1 1/30/2023
在代码中是如何表示的?是字符串,还是其他什么?<NA>"<NA>"None
1赞 midoriya007 1/30/2023
它实际上是一个 numpy NAN 值,我正在将其转换为列表。请将其视为任何 null/占位符值。我可以在代码中更改占位符。
1赞 Samwise 1/30/2023
这并不是真正的排序问题,而是一个匹配问题。请查看 en.m.wikipedia.org/wiki/Matching_(graph_theory)。
2赞 Kelly Bundy 1/30/2023
@Samwise 不,看起来他们希望每两条连续边之间有这种连接,即欧拉路径。我想说的是,它可以像拓扑排序一样被认为是排序。
1赞 wjandrea 1/30/2023
欢迎回到 Stack Overflow!请参加参观。这是一个问答网站,但您还没有提出问题,也不清楚您到底需要什么帮助。你已经尝试过什么,你卡在哪里?请阅读如何提问

答:

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]]