如何计算列表末尾的出现次数

时间:2012-12-28 20:30:43

标签: python

我想在python的列表末尾计算相同的出现次数。这样做非常简单,但我也对一些有趣的解决方案感兴趣。列表只能包含“1”或“2”项。结果必须在[3,4,5]。如果小于2退出,如果超过5退出5。

示例:

我们有

  L = [1,1,2]
  Result: None (quit)

  L = [1,2,1,1]
  Result: None (quit)

  L = [1,2,1,1,1]
  Result: 3

  L = [1,1,2,2,2,2]
  Result: 4

  L = [1,2,1,1,1,1,1,1]
  Result: 5

5 个答案:

答案 0 :(得分:2)

我完成了给出可读答案的无聊工作。 ;)它适用于所有类型的元素,而不仅仅是12

In [1]: def list_end_counter(lst):
  ....:     counter = 0
  ....:     for elem in reversed(lst):
  ....:         if elem == lst[-1]:
  ....:             counter += 1
  ....:         else:
  ....:             break
  ....:     if counter < 3:
  ....:         return None
  ....:     elif counter > 5:
  ....:         return 5
  ....:     return counter

稍加修改以保存一些行:

In [1]: def list_end_counter(lst):
  ....:     def stop():
  ....:         raise StopIteration()
  ....:     counter = sum(1 if elem == lst[-1] else stop() for elem in reversed(lst))
  ....:     return None if counter < 3 else 5 if counter > 5 else counter

两者都给出了正确的结果:

In [2]: print list_end_counter([1,1,2])
None

In [3]: print list_end_counter([1,2,1,1])
None

In [4]: print list_end_counter([1,2,1,1,1])
3

In [5]: print list_end_counter([1,1,2,2,2,2])
4

In [6]: print list_end_counter([1,2,1,1,1,1,1,1])
5

答案 1 :(得分:2)

喜剧一行答案:

def countOccurencesAtTheEndOfTheList(L):
    return (lambda num: None if num <= 2 else min(5, num))(len(L) if all(map(lambda x: x == L[-1], L)) else len(L) - 1 - [idx for idx, x in enumerate(L) if x != L[-1]][-1])

print countOccurencesAtTheEndOfTheList([1,1,2])
print countOccurencesAtTheEndOfTheList([1,2,1,1])
print countOccurencesAtTheEndOfTheList([1,2,1,1,1])
print countOccurencesAtTheEndOfTheList([1,1,2,2,2,2])
print countOccurencesAtTheEndOfTheList([1,2,1,1,1,1,1,1])

输出:

None
None
3
4
5

说明:

[idx for idx, x in enumerate(L) if x != L[-1]]获取L的每个元素与最后一个元素不匹配的索引。
[idx for idx, x in enumerate(L) if x != L[-1]][-1]获取与最后一个元素不匹配的最右边元素的索引。这仅在列表中的所有元素不相同时才有效 如果列表中的所有元素不相同,len(L) - 1 - [the above line]将获取列表末尾与最后一个元素匹配的元素数。
仅当列表中的所有元素都相同时,all(map(lambda x: x== L[-1], L)才返回True len(L) if [the above line] else [the line above the above line]获取列表末尾与最后一个元素匹配的元素数,无论列表中的所有元素是否相同。
如果值太低,lambda num: None if num <= 2 else min(5, num)会返回None,并将最大可能值限制为5。

警告:仅限娱乐用途。请不要写这样的代码。

答案 2 :(得分:1)

您可以尝试使用itertools.groupby,因为如果它们未排序,它会单独对键进行分组(为了显示输出,这会为{&lt; 2返回False - 您可以改变你想要的任何东西)。使用groupby,您将获得一个采用(key, values)形式的迭代,其中values是另一个包含与该键相关的所有值的迭代。在这种情况下,我们不关心密钥(因此_),我们将values转换为列表然后获取它的长度(这导致一个长度列表,在[1, 1, 2]的情况下看起来像[1, 2, 1, 1]。然后我们从该列表中取出最后一项,它表示最后一个元素重复的次数。从那里,我们应用返回值的逻辑:

In [1]: from itertools import groupby

In [2]: def my_func(l):
   ...:     val = [len(list(g)) for _, g in groupby(l)][-1]
   ...:     if val < 3:
   ...:         return False
   ...:     return min(val, 5)
   ...: 

In [3]: 

In [4]: L = [1,1,2]

In [5]: my_func(L)
Out[5]: False

In [6]: L = [1,2,1,1]

In [7]: my_func(L)
Out[7]: False

In [8]: L = [1,2,1,1,1]

In [9]: my_func(L)
Out[9]: 3

In [10]: L = [1,1,2,2,2,2]

In [11]: my_func(L)
Out[11]: 4

In [12]: L = [1,2,1,1,1,1,1,1]

In [13]: my_func(L)
Out[13]: 5

答案 3 :(得分:1)

这是另一个想法:

def count(l):
    n = l[::-1].index([2,1][l[-1] - 1])
    return min(n, 5) if n > 2 else None

print count([1,1,2])
print count([1,2,1,1])
print count([1,2,1,1,1])
print count([1,1,2,2,2,2])
print count([1,2,1,1,1,1,1,1])
None
None
3
4
5

答案 4 :(得分:0)

可以使用

'index'列表方法进行搜索。 我假设如果列表全部为1,则需要与单个2前置到该列表时相同的结果;如果全部为2,则结果与1之前的结果相同......

def mejmo_count( lst ):

    if len(lst) >= 3:          # otherwise answer is None
       tail = lst[-2:-6:-1]    # extract last part, reversed (omit final)
       x = 3-lst[-1]           # search for this..
       n = (tail + [x]).index(x) # find the first x (sentinel found if not present)
       if n >= 2:             # n can be 0..4 here
           return n+1
    return None