【问题标题】:Skip some values while counting计数时跳过一些值
【发布时间】:2020-04-07 15:44:59
【问题描述】:

我有清单:

s = list(map(int, ['0', '0', '2', '1', '1', '0', '0', '0']))

我需要弄清楚如何从具有更多并发的列表中获取一个非零数字(在本例中为 '1')。如果数字的并发性相同(例如 ['0', '2', '2', '1', '1', '0', '0'])取第一个非零数在列表中(在本例中为 '2')。如果列表由零组成,则返回零。

好像

max(set(s), key=s.count)

可以提供帮助,但它有零问题。对于上面的示例,它返回 0。

【问题讨论】:

标签: python


【解决方案1】:

你可以使用collections.Counter:

from collections import Counter
s =  ['0', '0', '2', '1', '1', '0', '0', '0']

try:
    print(next(t[0] for t in Counter(s).most_common(2) if t[0] != '0'))
except StopIteration:
    print('0')

输出:

1

Counter.most_common

从 最常见到最少。如果 n 被省略或没有,most_common() 返回计数器中的所有元素。具有相等计数的元素是 按照最先遇到的顺序排列

【讨论】:

  • 是否可以从 try-except 创建函数?
  • 你可以创建一个有 try except 的函数 :)
  • 遇到了问题。这是我的问题:stackoverflow.com/questions/61088675/…
  • 什么问题??
  • 我已经拿到了。我也需要从 except 块返回。感谢您的帮助!
【解决方案2】:

Counter 按顺序注册值,因此它完全符合您的要求:

from collections import Counter
l = list(map(int, ['0', '0', '1', '1', '2', '2', '0', '0']))
c = Counter(l)
del c[0]
c.most_common(1)[0][0]

输出:

1

如果我更改列表以便首先有 2 个,则输出将更改:

l = list(map(int, ['0', '0', '2', '1', '2', '1', '0', '0']))
c = Counter(l)
del c[0]
c.most_common(1)[0][0]

输出:

2

【讨论】:

  • 如果我取 ['0', '0', '0', '0', '0', '0', '0', '0'] 我得到一个错误:IndexError : 列表索引超出范围
  • 抱歉,错过了try - except
猜你喜欢
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 2015-03-26
相关资源
最近更新 更多