Python:确定列表中相等项的顺序的长度 [英] Python: determine length of sequence of equal items in list
问题描述
我有一个列表如下:
l = [0,0,0,0,0,0,1 ,1,1,1,1,1,0,0,0,0,2,2,2]
我想确定一系列相等项的长度,即对于给定的列表,我想要的输出是:
[(0,6),(1,6),(0,4),(2,3)]
(或类似格式)。
我考虑过使用 defaultdict
,但是它计算每个项目的出现次数并累加到整个列表中,因为我不能有多个键'0'。
现在,我的解决方案如下所示:
out = []
cnt = 0
last_x = l [0]
for x in l:
if x == last_x:
cnt + = 1
else:
out.append((last_x,cnt))
cnt = 1
last_x = x
out.append((last_x,cnt))
打印输出
I
你几乎肯定要使用 itertools.groupby :
l = [0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,2,2,2]
answer = [ ]
for key,iter in itertools.groupby(l):
answer.append((key,len(list(iter))))
#answer is [ 0,6),(1,6),(0,4),(2,3)]
<如果你想让它更高的内存效率,但添加更多的复杂性,你可以添加一个长度函数:
def length (l):
$请注意,虽然我没有基准的length()函数,它很可能会减慢你。
if hasattr(l,'__len__'):
return len(l)
else:
i = 0
for _ in l:
i + = 1
return i
l = [0,0,0,0,0,0,1,1,1,1,1,1,0,0,0 ,0,2,2,2]
answer = []
for key,iter in itertools.groupby(l):
answer.append((key,length(iter)))
#answer is [(0,6),(1,6),(0,4),(2,3)]
I have a list as follows:
l = [0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,2,2,2]
I want to determine the length of a sequence of equal items, i.e for the given list I want the output to be:
[(0, 6), (1, 6), (0, 4), (2, 3)]
(or a similar format).
I thought about using a
defaultdict
but it counts the occurrences of each item and accumulates it for the entire list, since I cannot have more than one key '0'.Right now, my solution looks like this:
out = [] cnt = 0 last_x = l[0] for x in l: if x == last_x: cnt += 1 else: out.append((last_x, cnt)) cnt = 1 last_x = x out.append((last_x, cnt)) print out
I am wondering if there is a more pythonic way of doing this.
解决方案You almost surely want to use itertools.groupby:
l = [0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,2,2,2] answer = [] for key, iter in itertools.groupby(l): answer.append((key, len(list(iter)))) # answer is [(0, 6), (1, 6), (0, 4), (2, 3)]
If you want to make it more memory efficient, yet add more complexity, you can add a length function:
def length(l): if hasattr(l, '__len__'): return len(l) else: i = 0 for _ in l: i += 1 return i l = [0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,2,2,2] answer = [] for key, iter in itertools.groupby(l): answer.append((key, length(iter))) # answer is [(0, 6), (1, 6), (0, 4), (2, 3)]
Note though that I have not benchmarked the length() function, and it's quite possible it will slow you down.
这篇关于Python:确定列表中相等项的顺序的长度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!