【问题标题】:Sort list of tuples in ascending order based on value at index 1根据索引 1 处的值按升序对元组列表进行排序
【发布时间】:2017-06-06 20:13:20
【问题描述】:

编写一个程序来通读 mbox-short.txt 并计算出每条消息在一天中每小时的分布情况。您可以通过查找时间然后使用冒号再次拆分字符串来从“From”行中提取小时。

From stephen.marquard@uct.ac.za Sat Jan  5 09:14:16 2008

当您累积了每小时的计数后,打印出按小时排序的计数,如下所示。 预期输出:

04 3
06 1
07 1
09 2
10 3
11 6
14 1
15 2
16 4
17 2
18 1
19 1

代码:

fname = raw_input('Enter file name: ')


fhand = open(fname)

c = dict()

for line in fhand:

  if not line.startswith('From ') : continue

  pieces = line.split()

  time = pieces[5]

  parts = time.split(':')

  hour = parts[0]
  c[hour] = c.get(hour,0) + 1

lst = list()
for key in c:
  value = c[key]
  lst.append( (value, key) )

lst.sort()

for value, key in lst:
  print key, value

我得到的输出

06 1 ← Mismatch
07 1
14 1
18 1
19 1
09 2
15 2
17 2
04 3
10 3
16 4
11 6

【问题讨论】:

  • 您的问题标题可以大大改进。单从标题来看,很明显这个问题以后不会让任何人受益。
  • 欢迎来到 Stack Overflow!看起来你正在寻求家庭作业帮助。虽然我们对此本身没有任何问题,但请注意这些dos and don'ts,并相应地编辑您的问题。

标签: python python-2.7 sorting


【解决方案1】:

lst 是一个 元组列表,每个元组都以 (value, key) 的格式保存值。并且您想根据元组的索引1 处的 key 对其进行排序。在这种情况下,您应该调用.sort(),键为:

from operator import itemgetter

lst.sort(key=itemgetter(1))

或者,你也可以使用 lambda 表达式 作为键:

lst.sort(key=lambda x: x[1])

此外,您不必创建单独的列表来打印已排序的内容。您可以使用sorted(c.items()) 对已排序的dict 对象进行迭代。因此,您可以这样做:

for key, value in sorted(c.items()):
    print key, value

代替:

lst = list()
for key in c:
  value = c[key]
  lst.append( (value, key) )

lst.sort()

for value, key in lst:
  print key, value

【讨论】:

  • 默认情况下,元组首先按其第一个元素排序,因此这与没有键的排序行为相同(除了具有相同第一个元素的项目将保持其原始顺序)。您是说元素 1 而不是 0
  • @TigerhawkT3 感谢您的指出。我错过了 OP 元组的反向对为 (value, key)
猜你喜欢
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 2017-02-03
相关资源
最近更新 更多