我想在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
答案 0 :(得分:2)
我完成了给出可读答案的无聊工作。 ;)它适用于所有类型的元素,而不仅仅是1
和2
。
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