【问题标题】:sorting list of tuples doesnt work元组的排序列表不起作用
【发布时间】:2015-12-02 02:53:33
【问题描述】:

这是我的第一个问题 =): 我的问题是标题中所说的。我想简单地对具有 2 个元素的元组列表进行排序。它应该与 sorted 一起使用,但它仍然返回未排序的 List,......它似乎什么也不做。 输入:

#"L =[(0, 1), (4, 6), (5, 7), (0, 6), (0, 4), (2, 5)]" Its an example.
for line in stdin:
 L = [int(i) for i in line.split()]
 n = L[0]
 V = [i for i in range(n)]
 edgelist = L[1:]
 EDGE = [(edgelist[i],edgelist[i+1]) for i in range(0,len(edgelist)-1,2) ]
 mK = missingKnots(edgelist)
 EDGE = sorted(EDGE)
 EDGE = list(set(EDGE))

输出:

[(0, 1), (4, 6), (5, 7), (0, 6), (0, 4), (2, 5)]

应该是:

[(0, 1), (0, 4), (0, 6), (2, 5), (4, 6), (5, 7)]

未排序 =(. 感谢阅读!

【问题讨论】:

  • 请用编写代码的编程语言标记问题。我认为它是 Python,但我没有足够的信心为你标记它。
  • 好的,谢谢! @约翰·布林格
  • 为什么不L.sort()?我看不到其他操作的意义
  • 该代码不会生成该输出。例如,没有print。显示您遇到问题的实际代码。
  • sorted()的返回值构造一个集合有什么意义?集合是无序的;你可能会失去从sorted() 获得的任何订单,没有明显的目的。

标签: python list sorting tuples


【解决方案1】:

排序并返回新列表:

>>> L =[(0, 1), (4, 6), (5, 7), (0, 6), (0, 4), (2, 5)]
>>> sorted(L)
[(0, 1), (0, 4), (0, 6), (2, 5), (4, 6), (5, 7)]

就地排序:

>>> L.sort()
>>> L
[(0, 1), (0, 4), (0, 6), (2, 5), (4, 6), (5, 7)]

之后不要使用set()。集合是无序的。

>>> list(set(L))
[(0, 1), (4, 6), (5, 7), (0, 6), (0, 4), (2, 5)] # now it's messed up again.

理想情况下,排序和删除重复项:

>>> L = [(0, 1), (4, 6), (5, 7), (0, 6), (0, 4), (2, 5), (0, 1)]
>>> sorted(set(L))
[(0, 1), (0, 4), (0, 6), (2, 5), (4, 6), (5, 7)]

【讨论】:

  • 最后排序,而不是第一个。 set() 搞砸了你的排序。
  • 转换成集合后需要排序。集合没有顺序,因此您的排序正在丢失。
  • @Mark Tolonen 谢谢!我看看它是否在没有设置的情况下工作。
  • @Mark Tolonen 谢谢。现在它可以工作了,我应该知道它会拧紧它......但现在我肯定会这样做!
【解决方案2】:

使用 lambda 表达式,可以自定义排序规则。

EDGE = [(0, 1), (4, 6), (5, 7), (0, 6), (0, 4), (2, 5)]
EDGE = sorted(EDGE, key=lambda x: (x[0],x[1]) )
print EDGE

结果:

 [(0, 1), (0, 4), (0, 6), (2, 5), (4, 6), (5, 7)]

【讨论】:

    猜你喜欢
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    相关资源
    最近更新 更多