【问题标题】:Sorting nodes of a undirected graph based on value in Python基于Python中的值对无向图的节点进行排序
【发布时间】:2019-01-09 08:07:21
【问题描述】:

我对 Python 比较陌生。我用 Python (3.x) 编写了这段代码来解决一个涉及无向图的问题。

程序的预期输出应该打印在相邻节点列表中出现在 kth 位置的节点,这些节点按降序排序(基于节点的值),但是如果两个值相同,则打印按索引升序排序时首先出现的节点。

如果不存在这样的节点,则打印 -1

n, m, k = input().strip().split(' ')
n, m, k = [int(n), int(m), int(k)]

node_values = list(map(int, input().split(' ')))
d = {}
for i in range(n+1):
    d[i] = []

for i in range(m):
    x, y = input().strip().split(' ')
    x, y = [int(x), int(y)]
    d[x].append(y)
    d[y].append(x)

for key, value in d.items():
    if key != 0:
        if k <= len(value):
            new_list = sorted(value, key=lambda x: node_values[x-1], reverse=True)
            print(new_list[k-1])
        else:
            print(-1)

在这里,我使用sort() 进行排序,提供来自node_values 的值作为键。但我对添加第二个条件感到困惑(如果值相同,则根据索引的升序对它们进行排序)。

我在这里做错了什么?另外,使用并行列表来表示图形而不是使用字典是更好的选择吗?

【问题讨论】:

    标签: python-3.x algorithm sorting graph


    【解决方案1】:

    用于排序的 lambda 函数可以返回一个元组,在您的情况下,该元组将形成为节点值和节点的索引。

    sorted(value, key=lambda x: (node_values[x-1], x), reverse=True)
    

    但您需要不同的顺序:节点值降序,索引升序。这可以通过对索引的负值进行降序排序来实现:x&lt;y =&gt; -y &lt; -x。所以你可以使用这个lamba函数:

    sorted(value, key=lambda x: (node_values[x-1], -x), reverse=True)
    

    我假设“x”是您节点的索引,但这对我来说不是很清楚。

    【讨论】:

    • 我仍然收到list,而不是你提到的tuple
    • 您能否提供一个可行的示例,以便我测试和理解您的问题? (有测试数据)
    • 这是问题所在:hackerearth.com/practice/algorithms/graphs/graph-representation/… 你可以在那里找到测试数据。实际上上面的代码适用于测试输入,但是当两个(或更多)值相似时就会出现问题
    • 实际上,问题与预期的解决方案不一致。它声明它期望索引按升序排列,但解决方案数据按降序排列......只需使用我答案的第一个 lambda。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 2017-09-17
    • 2015-05-18
    • 2018-01-16
    • 1970-01-01
    相关资源
    最近更新 更多