4

我想在 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
4

5 回答 5

2

我完成了给出可读答案的无聊工作。;) 它适用于各种元素,而不仅仅是1s 和2s。

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
于 2012-12-28T20:59:32.053 回答
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)返回,并将可能的最大值限制为 5。None

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

于 2012-12-28T21:01:54.010 回答
1

您可以尝试利用itertools.groupby这样一个事实,即如果键未排序,它将分别对键进行分组(返回False< 2 只是为了显示输出 - 您可以更改为任何您想要的)。使用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
于 2012-12-28T20:45:44.657 回答
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])
没有任何
没有任何
3
4
5
于 2012-12-28T20:57:18.077 回答
0

列表的“索引”方法可用于进行搜索。我假设如果列表全为 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
于 2012-12-28T21:12:17.530 回答