0

両方の方法を知るために、このプログラムを for ループに変更する方法を学ぼうとしています。

def Diff(a_list):
    num = enumerate(max(x) - min(x) for x in a_list)
    return max(x[::-1] for x in num)

のようなものにしたい

def Diff(x):
    for a in x

プログラムが内部の要素の合計が最小の行を返すことを目的としているのに役立つ場合は、次のよう[[1,2,3,4],[-500],[10,20]]になります1

4

3 に答える 3

1

関数にこの名前を使用する理由がわかりません。(私が理解している限り)他のことをします。最小値と最大値の差であるスパンが最大であるリスト内の内部リストを検索し、nは外部ループ内のインデックスであるタプル(span, idx)を返します。idx

ループと同じものにしたい場合は、次のことを試してください。

def minRow_loop(a_list):
    rv = (0,0)
    for idx, row in enumerate(a_list):
        span = max(row) - min(row)
        span_and_idx = (span, idx)
        if span_and_idx > rv:
            rv = span_and_idx
    return rv

しかし、あなたのコードは意図したとおりに動作しないので、ループがある場合とない場合の2つの正しいバージョンを作成しました。

import random
random.seed(12346)

def minRow(a_list):
    num = enumerate(max(x) - min(x) for x in a_list)
    return max(x[::-1] for x in num)

def minRow_loop(a_list):
    rv = (0,0)
    for idx, row in enumerate(a_list):
        span = max(row) - min(row)
        span_and_idx = (span, idx)
        if span_and_idx > rv:
            rv = span_and_idx
    return rv

def minRow_correct(a_list):
    return min(enumerate([sum(l) for  l in a_list]),
               key=lambda (idx, val): val)[0]

def minRow_correct_loop(a_list):
    min_idx = 0
    min_sum = 10e50
    for idx, list_ in enumerate(a_list):
        sum_ = sum(list_)
        if sum_<min_sum:
            min_idx = idx
            min_sum = sum
    return min_idx

li = [[random.random() for i in range(2)] for j in range(3)]
from pprint import pprint
print "Input:"
pprint(li)

print "\nWrong versions"
print minRow(li)
print minRow_loop(li)

印刷するもの:

Input:
[[0.46318380478657073, 0.7396007585882016],
 [0.38778699106140135, 0.7078233515518557],
 [0.7453097328344933, 0.23853757442660117]]

Wrong versions
(0.5067721584078921, 2)
(0.5067721584078921, 2)

Corrected versions
2
2
于 2013-02-11T10:14:39.637 に答える
0

必要なことは、実際には2行のコードで実行できます。

# Let's take the list from your example
lst = [[1,2,3,4],[-500],[10,20]]

# Create a new list holding the sums of each sublist using a list comprehension
sums = [sum(sublst) for sublst in lst]

# Get the index of the smallest element
sums.index(min(sums))  # Returns: 1
于 2013-02-11T10:54:59.150 に答える
0

最小合計を探している場合は、すべての行を調べて最小のものを追跡してください。

def minRow(theList):
    foundIndex = 0 # assume first element is the answer for now.
    minimumSum = sum(theList[0])

    for index, row in enumerate(theList):
        if sum(row) < minimumSum:
            foundIndex = index
            minimumSum = sum(row) # you don't have to sum() twice, but it looks cleaner

    return foundIndex

最大の範囲 (最初の Diff() 関数など) を探している場合も同様です。最大の範囲を追跡し、そのインデックスを返します。

Thorstenの答えは非常に完全です。しかし、とにかくこれを終えたので、理解に役立つ場合に備えて、「馬鹿げた」バージョンを送信します.

于 2013-02-11T10:42:31.403 に答える