反转Counter()输出的顺序

时间:2017-08-17 18:54:11

标签: python counter reverse tokenize

有没有人知道在不执行新列表推导的情况下反转.Counter()输出的顺序? 我的意思是在“标记化”列表中使用.Counter()。从原始文本中得到的单词,例如

[('a', 100),
 ('b', 90),
 ('c', 80),
 ('d', 50),
 ('e', 10)]

是否有一种简单的方法来交换每个.Counter()输出元组中的元素顺序,使其成为

[(100, 'a'),
 (90, 'b'),
 (80, 'c'),
 (50, 'd'),
 (10, 'e')]

谢谢。

3 个答案:

答案 0 :(得分:1)

您可以使用列表推导来反转元组的顺序:

>>> data = \
[('a', 100),
 ('b', 90),
 ('c', 80),
 ('d', 50),
 ('e', 10)]
>>> 
>>> pprint([(b, a) for a, b in data])
[(100, 'a'), (90, 'b'), (80, 'c'), (50, 'd'), (10, 'e')]
>>> 

答案 1 :(得分:1)

你可以这样做:

>>> lst = [(100, 'a'),
           (90, 'b'),
           (80, 'c'),
           (50, 'd'),
           (10, 'e')]

>>> map(lambda x: (x[1], x[0]), lst)
[(100, 'a'), (90, 'b'), (80, 'c'), (50, 'd'), (10, 'e')]

这避免了列表理解。

答案 2 :(得分:1)

从您提供的数据集开始......

>>>original = [('a', 100),
               ('b', 90),
               ('c', 80),
               ('d', 50),
               ('e', 10)]

虽然你的问题试图在不使用新列表理解的情况下解决这个问题,但Python允许你轻松处理一个列表并使用列表推导创建一个新列表并使用它们

  • Pythonic(被更广泛的社区广泛认可为惯用和有效的Python编程实践)
  • 极快,引擎盖下......列表理解已经大大优化了速度和效率

下面的示例创建一个由元组组成的列表,其中每个元组的元素顺序都是交换的

>>> output = [(y, x) for x, y in original]

>>> print(output)
[(100, 'a'), 
 (90, 'b'),
 (80, 'c'), 
 (50, 'd'), 
 (10, 'e')]

基于OP关于Counter是否具有内置机制来进行交换的评论...

collections.Counter附带了这些方法,这些方法都没有完成所要求的工作。

.clear()
.fromkeys()
.keys()
.popitem()
.update()
.copy()
.get()
.most_common() 
.setdefault() 
.values()
.elements()    
.items()
.pop()
.subtract()