iT邦幫忙

0

如何在二元list中計算連續出現元素個數並在遭遇非同元素時結束,遇到同元素再重新繼續

  • 分享至 

  • xImage

各位大大好!
假如我現在有一個二元的list=
['1', '0', '1', '0', '1', '1', '0', '0', '1', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '1', '1', '1']

我要怎麼計算每次碰到1之前出現的0的次數累積(但1也要計算如果有重複的話

1 0
1 0
11 00
1 0
1 00000000000
11 00000
1 00000
111

所以資料會變成
category(1,0)
1,1
1,1
2,2
1,1
1,10
2,5
3,0
以此類推....

#因為我的帳號是新手訓練帳號不能進行回應 不過的確就是遇到1會製造一個斷點

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
海綿寶寶
iT邦大神 1 級 ‧ 2022-08-31 11:36:49

我只會用最笨的方法(自己加總)寫
結果如下
https://ithelp.ithome.com.tw/upload/images/20220831/20001787PlC8Rjw2m5.png

kw6732 iT邦研究生 4 級 ‧ 2022-08-31 11:43:44 檢舉

我的解讀是

2,5
1,5
3,0

基本判斷方法是 上一個是0 下一個是1 就製造一個斷點

0
sma739146
iT邦新手 5 級 ‧ 2022-08-31 14:52:59

我是以第一個值一定是 '1' 為基準寫的,如果有 '0' 開始的,那就要改一下邏輯,就自己加幾個判斷自己寫吧。

from itertools import zip_longest

data = [[arr[0], 1]]

for n in arr:
    if data[-1][0] == n:
        data[-1][1] += 1
    else:
        data.append([n, 1])
        
for one, zero in list(zip_longest(data[::2], data[1::2], fillvalue=['0', 0])):
    print(f'{one[1]},{zero[1]}')
0
mackuo
iT邦研究生 1 級 ‧ 2022-08-31 17:36:13

試解如下,不曉得是不是樓主要的:

from itertools import groupby

mylist = (['1', '0', '1', '0', '1', '1', '0', '0', '1', '0', '1', 
           '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1',
           '1', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '1', '1', '1'])

res = [(len(list(cgen))) for c, cgen in groupby(mylist)]
if mylist[-1] == '1':
    res.append(0)

res

[1, 1, 1, 1, 2, 2, 1, 1, 1, 10, 2, 5, 1, 5, 3, 0]

for i in range(0, len(res), 2):
    print(res[i], res[i+1])

1 1
1 1
2 2
1 1
1 10
2 5
1 5
3 0

我要發表回答

立即登入回答