簡體   English   中英

如何計算列表末尾的出現次數

[英]How to count occurences at the end of the list

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

我完成給出一個可讀的答案的無聊工作。 ;)它適用於各種元素,而不僅僅是1 s和2 s。

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

喜劇單行答案:

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否則,如果值太低, lambda num: None if num <= 2 else min(5, num)將返回None ,並將可能的最大值限制為5。

警告:僅用於娛樂目的。 請不要編寫這樣的代碼。

您可以利用itertools.groupby來嘗試利用以下事實:如果未排序鍵,它將對鍵進行單獨分組(為了顯示輸出,此鍵返回<2的False ,以便顯示輸出-您可以更改為所需的任何值)。 使用groupby ,您將獲得一個采用(key, values)形式的iterable,其中values是另一個iterable,其中包含與key有關的所有值。 在這種情況下,我們不在乎鍵(因此使用_ ),而是將values轉換為列表,然后獲取其長度(這將導致列表的長度看起來像[1, 1, 2][1, 2, 1, 1] [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

這是另一個想法:

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

列表的“索引”方法可用於進行搜索。 我假設如果列表全部為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM