coltonOP
@coltonOP (こるとんくん)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

[Python]配列で1の連続値を取得したい

解決したいこと

Pythonで同じものが続いたときの連続値は取得できるのでしょうか?
検索しても難しい関数を使ったものしかでてこなく、もっと簡単にできるのではと考えているのですが
なかなかうかばないため、皆さんの意見や知識を教えて欲しいです。

list1 = [ 0, 1, 1, 1, 1, 0, 0, 1, 1, 0 ]

print(list1_RenzokuNum)

*結果 4

list2 = [ 0, 1, 1, 1, 0, 0, 1, 1, 1, 0 ]

print(list2_RenzokuNum)

*結果 3

 

0

5Answer

変態さん用(「1」限定)

def RenzokuNum(l):
    return (a:=0) or max([(a:=a*i+i) for i in l])
2Like

Comments

  1. なるほど、ちょっと理解するのに時間が掛かりましたが、配列の中身が0か1のみの場合、これでできますね。
    配列の中身が「連続数をカウントしたい特定値とそれ以外」バージョンも、頑張れば作れそうですね……!

    (追記)
    思ったより簡単に、変態性を保ちつつ要件を満たしそうなものができました…!

    ```python
    def RenzokuNum(l, needle):
    return (a:=0) or max([(a:=(a+1)*(i == needle)) for i in l])
    ```
  2. @daisei-yoshino さん

    変態度を上げれば、任意の配列要素の最長連続数も得られます。

    ```py
    def RenzokuNum(l):
    return (a:=0)or(b:=None)or max([(a:=a*(b==(b:=i))+1)for i in l])
    ```
  3. へ……変態だ……!!
    こういうの大好きです……!!

どこからが難しいと見なされるかが分からないですが…
少なくとも、ループは使わないと実装は難しいと思います。

0Like

検索しても難しい関数を使ったものしかでてこなく

たとえば

の「連続する1の数え上げ」がありますが速度及びシンプルさではこれが限界です.

0Like

簡単にできる=ライブラリを使わない、という意味なら、文字列にすると正規表現とかsplitとか無理やりなコードかけるからなにかヒントあるかも……。

search_no = 1
list1 = [ 0, 1, 1, 1, 1, 0, 0, 1, 1, 0 ]

list1_str_list = ["o" if i == search_no else "x" for i in list1]
list1_str = ''.join(list1_str_list)
list1_RenzokuNum = max(map(len, list1_str.split("x")))
print(list1_RenzokuNum)
# 4
0Like

あまりうまくないけど、

def RenzokuNum(list_):
    n = len(list_)
    list_renzokunum = [0] * n
    for i in range(n):
        if list_[i] == 1:
            list_renzokunum[i] = list_renzokunum[i - 1] + 1
    return max(list_renzokunum)


list1 = [ 0, 1, 1, 1, 1, 0, 0, 1, 1, 0 ]
print(RenzokuNum(list1))
# 4

list2 = [ 0, 1, 1, 1, 0, 0, 1, 1, 1, 0 ]
print(RenzokuNum(list2))
# 3
0Like

Your answer might help someone💌