1

私は Python 3.2.3 を使用しており、リスト内の特定の要素から最大数を見つけたいと考えています。どの要素が最大数であるかについてある程度の知識を保持することも重要ですが、これがどのように発生するかについては非常に柔軟です. 説明させてください...

バックグラウンド

次のリストがあります。

the_list = ['Order', '1', '5', 'Order', '2', '18', 'Order', '3', '45', 'Order', '4', '2', 'Order', '5', '8', 'Order', '6', '2', 'Order', '7', '1', 'Order', '8', '1', 'Order', '9', '1']

3 つのリスト要素ごとに、最初の 2 つはデータの記述です。つまり、「Order 1」、「Order 2」、「Order 3」のように「Order」、「1」、...「Order」、「 2'、... 'Order'、'3'、... 'Order 9' まで。これらは変更されず、3 つおきのリスト要素のソースまたは名前を提供します。

3 つのリスト要素ごとに 3 番目が問題の情報です。この例では、数値は 5... 18... 45... 2... などです。この 3 番目ごとの要素から、最大数を見つけたいと思います。この場合、その最大数は 45 です。これらの数は常に変化します。0 から 100 までの任意の整数を指定できます。

これまでに試したこと

Python の max() 関数を 2 つの方法で使用してみました。まず、単純に...

max(the_list)

...最大値として「注文」を提供します。私の目標の残念。

そこで、元のリストの 3 番目ごとの要素だけで構成される新しいリストを作成してみることにしました。そのようです...

foo = (the_line[2], the_line[5], the_line[8], the_line[11], the_line[14], the_best_line[17], the_best_line[20], the_best_line[23], the_best_line[26])

max(foo)

... これは、最大数として「8」、15 番目のリスト要素、および 5 番目の 3 番目のリスト要素を提供します。これは数値ですが、[この例では] 45 という最大の数値ではありません。

私はまた、一連の if-else ステートメントを作成することに手を出しましたが、成功せず、より Pythonic//elegant な方法が必要であるという考え方に陥りました。私は、このルートであまりにも早く辞めた可能性があること、および/または私の考え方が間違っていることを認めます.

4

4 に答える 4

7

このようなものが機能するはずです:

>>> the_list = ['Order', '1', '5', 'Order', '2', '18', 'Order', '3', '45', 'Order', '4', '2', 'Order', '5', '8', 'Order', '6', '2', 'Order', '7', '1', 'Order', '8', '1', 'Order', '9', '1']
>>> the_list[::3]
['Order', 'Order', 'Order', 'Order', 'Order', 'Order', 'Order', 'Order', 'Order']
>>> the_list[2::3]
['5', '18', '45', '2', '8', '2', '1', '1', '1']
>>> max(int(num) for num in the_list[2::3])
45

ここで、Pythonのスライス表記3を使用して、要素#2(つまり)から始まる要素の3分の1(つまり)を取得2the_list[2::3]ました。

the_listただし、のエントリは文字列であり、数値ではなく辞書式にソートされるため、それだけでは十分ではありません。int(num)そのため、各用語を呼び出しmaxジェネレータ式を渡す必要がありました。ここでは、「(someseqのelemの何か)」の形式で渡します。

また、どの要素が最大であるかを追跡することが重要であると言います。これにより、インデックスが必要であると想定します。最大値が与えられると、それに一致する要素の別の検索を使用して、どの要素が最大値を持っているかを簡単に見つけることができます(通常、一意ではない可能性があります)。これはおそらく最も簡単です。maxまたは、インデックス自体を呼び出しにエンコードすることもできます。

>>> max((int(num), i) for i, num in enumerate(the_list[2::3]))
(45, 2)

これは、最大値と3つのグループのインデックスを提供し、タプルが最初の要素、次に2番目の要素などでソートされるため機能します。このアプローチでは、一意でない最大値も処理されません。

ただし、正直に言うと、おそらく@astynaxのようにデータの形を変更することから始めます。このリストは、フラットである必要があるとは思えません。

于 2012-06-24T17:38:10.713 に答える
5
>>> the_list = ['Order', '1', '5', 'Order', '2', '18', 'Order', '3', '45', 'Order', '4', '2', 'Order', '5', '8', 'Order', '6', '2', 'Order', '7', '1', 'Order', '8', '1', 'Order', '9', '1']
>>> items = zip(*[iter(the_list)] * 3)
>>> items
[('Order', '1', '5'), ('Order', '2', '18'), ('Order', '3', '45'), ('Order', '4', '2'),('Order', '5', '8'), ('Order', '6', '2'), ('Order', '7', '1'), ('Order', '8', '1'), ('Order', '9', '1')]    
>>> max(items, key=lambda x: int(x[2]))
('Order', '3', '45')
于 2012-06-24T17:43:25.740 に答える
3
   >>> the_list = ['Order', '1', '5', 'Order', '2', '18', 'Order', '3', '45', 'Order', '4', '2', 'Order', '5', '8', 'Order', '6', '2', 'Order', '7', '1', 'Order', '8', '1', 'Order', '9', '1']
   >>> max(map(int,the_list[2::3]))
    45

ここでは、[2::3]represente stepの 3 です。つまり、'5' の後は '18' にジャンプし、次に '45' にジャンプするというように、毎回 3 ずつジャンプします。指定しない場合のデフォルト値stepは 1 です。そう、

>>> the_list[2::3]
['5', '18', '45', '2', '8', '2', '1', '1', '1']

map() は、イテラブルのすべてのオブジェクトに特定の関数を適用する関数です。この場合はthe_list[2::3]であり、適用される関数は ですintmap()Python 2.x ではリストを返し、Python 3.x ではマップ オブジェクトを返します。

于 2012-06-24T17:40:48.427 に答える
0

あなたは次のようなことを試すことができます

my_max = max( [the_list[i] for i in range(len(the_list)) if (i+1)%3==0 ] )
于 2012-06-24T17:40:31.610 に答える