stack overflow でこういう質問が出てまして。
How to find positions of the list maximum? - Stack Overflow
I have a list:
a = [32, 37, 28, 30, 37, 25, 27, 24, 35, 55, 23, 31, 55, 21, 40, 18, 50,
35, 41, 49, 37, 19, 40, 41, 31]
max element is 55 (two elements on position 9 and 12)
I need to find on which position the maximum elements are situated. Please, help.
寄せられた回答のスクリプト(一部)。
>>> m = max(a)
>>> [i for i, j in enumerate(a) if j == m]
[9, 12]
a.index(max(a))
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> a = [32, 37, 28, 30, 37, 25, 27, 24, 35, 55, 23, 31, 55, 21, 40, 18, 50, 35, 41, 49, 37, 19, 40, 41, 31]
>>> for i, x in enumerate(a):
... d[x].append(i)
...
>>> k = max(d.keys())
>>> print k, d[k]
55 [9, 12]
Later: for the satisfaction of @SilentGhost
>>> from itertools import takewhile
>>> import heapq
>>>
>>> def popper(heap):
... while heap:
... yield heapq.heappop(heap)
...
>>> a = [32, 37, 28, 30, 37, 25, 27, 24, 35, 55, 23, 31, 55, 21, 40, 18, 50, 35, 41, 49, 37, 19, 40, 41, 31]
>>> h = [(-x, i) for i, x in enumerate(a)]
>>> heapq.heapify(h)
>>>
>>> largest = heapq.heappop(h)
>>> indexes = [largest[1]] + [x[1] for x in takewhile(lambda large: large[0] == largest[0], popper(h))]
>>> print -largest[0], indexes
55 [9, 12]
a = [32, 37, 28, 30, 37, 25, 27, 24, 35, 55, 23, 31, 55, 21, 40, 18, 50,
35, 41, 49, 37, 19, 40, 41, 31]
def maxelements(seq):
''' Return list of position(s) of largest element '''
max_indices = []
if len(seq):
max_val = seq[0]
for i,val in ((i,val) for i,val in enumerate(seq) if val >= max_val):
if val == max_val:
max_indices.append(i)
else:
max_val = val
max_indices = [i]
return max_indices
んで、
C:\>irb
irb(main):001:0> RUBY_VERSION
=> "1.8.7"
irb(main):002:0> x=[*"A".."Z"]
=> ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
irb(main):003:0> x=[*"A".."Z"].shuffle
=> ["L", "S", "P", "T", "A", "X", "H", "M", "I", "E", "B", "J", "G", "Y", "O", "U", "Q", "R", "K", "F", "C", "N", "Z", "D", "W", "V"]
irb(main):004:0> x
=> ["L", "S", "P", "T", "A", "X", "H", "M", "I", "E", "B", "J", "G", "Y", "O", "U", "Q", "R", "K", "F", "C", "N", "Z", "D", "W", "V"]
irb(main):007:0> x.zip([1..x.size])
=> [["L", 1..26], ["S", nil], ["P", nil], ["T", nil], ["A", nil], ["X", nil], ["H", nil], ["M", nil], ["I", nil], ["E", nil], ["B", nil], ["J", nil], ["G", nil]
, ["Y", nil], ["O", nil], ["U", nil], ["Q", nil], ["R", nil], ["K", nil], ["F",nil], ["C", nil], ["N", nil], ["Z", nil], ["D", nil], ["W", nil], ["V", nil]]
irb(main):008:0> x.zip((1..x.size).to_a)
=> [["L", 1], ["S", 2], ["P", 3], ["T", 4], ["A", 5], ["X", 6], ["H", 7], ["M",8], ["I", 9], ["E", 10], ["B", 11], ["J", 12], ["G", 13], ["Y", 14], ["O", 15],
["U", 16], ["Q", 17], ["R", 18], ["K", 19], ["F", 20], ["C", 21], ["N", 22], ["Z", 23], ["D", 24], ["W", 25], ["V", 26]]
irb(main):009:0> x.zip((1..x.size).to_a).max
=> ["Z", 23]
irb(main):010:0> x.zip((1..x.size).to_a).max[1]
=> 23
irb(main):011:0>
なんてのを考えたりしたのですが、この、
1から順に増えていく数値と zip する部分が気に入らない。
x,size なんてのがでてるし。
irb(main):011:0> x
=> ["L", "S", "P", "T", "A", "X", "H", "M", "I", "E", "B", "J", "G", "Y", "O", "U", "Q", "R", "K", "F", "C", "N", "Z", "D", "W", "V"]
irb(main):013:0> x.inject([]){|r, i| r<<[i, r.size]}
=> [["L", 0], ["S", 1], ["P", 2], ["T", 3], ["A", 4], ["X", 5], ["H", 6], ["M",7], ["I", 8], ["E", 9], ["B", 10], ["J", 11], ["G", 12], ["Y", 13], ["O", 14],
["U", 15], ["Q", 16], ["R", 17], ["K", 18], ["F", 19], ["C", 20], ["N", 21], ["Z", 22], ["D", 23], ["W", 24], ["V", 25]]
irb(main):014:0>
というのも考えたのですがやはり気に入らない。
[i for i, j in enumerate(a) if j == m]
の enumerate(a) のようにビシッっといけないもんでしょうか。
each_with_index は index は具合がいいんだけど戻り値 self だし、
ブロックの中で変数に追加していくのはその変数を外側で作っておく必要があるのでそれは却下と。