4

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
4

5 に答える 5

2

私は読みやすい答えを出すという退屈な仕事をしています。;) 1s と2s だけでなく、あらゆる種類の要素で動作します。

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
于 2012-12-28T20:59:32.053 に答える
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)戻り、可能な最大値を 5 にクランプします。None

警告: 娯楽のみを目的としています。このようなコードを書かないでください。

于 2012-12-28T21:01:54.010 に答える
1

itertools.groupbyソートされていない場合はキーが個別にグループ化されるという事実を利用して使用してみることができます(これはFalse、出力を表示するためだけに2未満で返されます-必要に応じて変更できます)。を使用groupbyすると、の形式をとるiterableが得られます(key, values)。ここで、valuesはキーに関連するすべての値を含む別のiterableです。この場合、キー(したがって)は気にせず、をリスト_に変換してからその長さを取得します(これにより、の場合の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
于 2012-12-28T20:45:44.657 に答える
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])
なし
なし
3
4
5
于 2012-12-28T20:57:18.077 に答える
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
于 2012-12-28T21:12:17.530 に答える