[英]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.