【问题标题】:Python 3.x: How do I sort a list of tuples that has the same second element (count) by string value?Python 3.x:如何按字符串值对具有相同第二个元素(计数)的元组列表进行排序?
【发布时间】:2016-09-14 14:01:01
【问题描述】:

例如

['John','John','Mike','Mike','Kate','Kate']

应该返回:

[('John', 2), ('Kate', 2), ('Mike', 2)]

我如何编写代码以便有顺序而不是这三对只是随机顺序?

除非有关系,否则我需要按计数从大到小对元组列表进行排序,然后我需要按字母顺序对时间进行排序。

【问题讨论】:

  • 没有。我需要按第二个元素对它们进行排序,除非有平局..然后知道该怎么做。
  • 获取第一个实例和.count(),然后放入列表
  • 我不关注你:(

标签: python python-3.x


【解决方案1】:

这行得通:

>>> names = ['John','John','Mike','Mike','Kate','Kate']
>>> sorted(Counter(names).items(), key=lambda item: (-item[1], item[0]))
[('John', 2), ('Kate', 2), ('Mike', 2)]

计数器的项目将为您提供(name, count) 的元组。通常你会使用Counter.most_common 按计数顺序获取项目,但据我所知,它仅按计数排序,而忽略排序中的任何键(名称)信息。

既然我们必须再次重新排序,我们不妨在项目上使用sorted。由于元组按字典顺序排序,并且您希望主要按计数排序,因此 key 函数应返回格式为 (count, name) 的元组。但是,由于您希望它按计数减少,但按名称​​增加,我们唯一能做的就是返回格式为(-count, name) 的元组。这样,较大的计数将导致较低的值,因此它将以较低的计数对 before 值进行排序。

【讨论】:

  • 对不起。我不确定我是否跟随你。我是 Python 新手……我不想只使用这段代码而不理解它。除非有关系,否则我需要按从大到小的计数对元组列表进行排序,然后我需要按字母顺序对时间进行排序。
  • 它应该是 sorted(Counter(names).items(), key=lambda item: item[::-1]) 和输入:names = ['John','John','Mike','Mike','Kate','Kate','ADF','ABCD','ACD','DF','BC'] 我得到的输出是 [('ABCD', 1), ('ACD', 1), ('ADF', 1), ('BC', 1), ('DF', 1), ('John', 2), ('Kate', 2), ('Mike', 2)] 这是正确的输出 @Random Stuff?
  • 计数最多的应该在前面,但除此之外是的。你能向我解释一下这是如何工作的吗?
  • @RandomStuff -- 我已尽力阐明文本中的关键点。有没有你没有关注的特定部分?
  • 我正在关注它,但我实际上是 Counter()、key、lambda 和在这种情况下使用 items() 的新手。我一个人想这个也是不可能的...我现在正在查找所有内容,但是如果您能解释这些术语,那就太好了!!!!!!
【解决方案2】:

您可以使用sorted() 函数对结果进行排序,使用key 参数来定义如何对项目进行排序:

result = [('John', 2), ('Kate', 2), ('Mike', 3)]
sorted_result = sorted(result, key=lambda x: (-x[1], x[0]))

由于您希望按计数值降序对结果进行排序,然后按升序对名称进行排序,因此键 (-x[1], x[0]) 可以解决问题。

sorted_result 将是:

[('Mike', 3), ('John', 2), ('Kate', 2)]

【讨论】:

  • 谢谢!我做了 result.sort(key=lambda x: (-x[1], x[0]) 并且它有效....但是你能彻底解释它是如何工作的吗?我不完全知道 key 或 lambda 做什么...另外,x[1] 之前的负号是否使它变成另一个顺序?
  • keysorted函数的命名参数,具体可以参考docs.python.org/3/library/functions.html#sortedlambda 用于就地定义无名函数。 (-x[1], x[0]) 中的第一个 -x[1] 将以相反的顺序对原始 count 部分进行排序。如果count部分相同,则第二个x[0]将用于对原始name部分进行升序排序。
  • 啊哈。有没有办法在不使用任何这些的情况下做到这一点?仅使用 for 循环和 if 语句?
【解决方案3】:

有两种方法可以做到这一点。在第一种方法中,返回一个排序列表。在第二种方法中,列表是就地排序的。

import operator

# Method 1
a = [('Mike', 2), ('John', 2), ('Kate', 2), ('Arvind', 5)]
print(sorted(a, key = lambda x : (x[0],)))

# Method 2
a = [('Mike', 2), ('John', 2), ('Kate', 2), ('Arvind', 5)]
a.sort(key=operator.itemgetter(0))
print(a)

【讨论】:

  • 嗨。除非有关系,否则我需要按从大到小的计数对元组列表进行排序,然后我需要按字母顺序对时间进行排序。除了字符串值,我还能如何做到这一点?
猜你喜欢
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 2021-10-16
  • 1970-01-01
  • 2011-02-07
相关资源
最近更新 更多