1

私はPythonを初めて使用し、解決できない問題が発生しています。

私は次の2D配列を持っています:

valuearray = [['A', '21', '45'], ['A', '12', '23'], 
              ['A', '54', '21'], ['A', '15', '54'], 
              ['B', '23', '53'], ['B', '34', '53'], 
              ['B', '32', '54'], ['B', '24', '13'], 
              ['C', '31', '43'], ['C', '42', '54'], 
              ['C', '35', '54'], ['C', '12', '11']]

A  21 45
A  12 23
A  54 21
A  15 54
B  23 53
B  34 53
B  32 54
B  24 13
C  31 43
C  42 54
C  35 54
C  12 11

この配列から、一意の値を持つ別の配列を生成する必要があります。それぞれvaluearray[0]の最大値はvaluearray[1] valuearray[0] 、最小値valuearray[2]はそれぞれです。valuearray[0]

結果は次のようになります。

resarray[]

    A  54 21
    B  34 13
    C  42 11

編集:私が試したものを提示しなかったことをお詫びします

    uniquenames = []
    un = []
    for i in range(len(valuearray)):
            un.append(valuearray[i][0])
    uniquenames=uniq(un)

test = []
for ci in range(len(valuearray)):
    for gn in range(len(uniquenames)):
        if(valuearray[ci][0] == uniquenames[gn]):
                      # i don't know what to do here
                      i tried append(valuearray[ci][0] , max(valuearray[ci][1]),min( valuearray[ci][2]))

しかし、追加は1つのパラメーターしか取らないので、続行する方法がわかりません。

そして、uniqは、リストから一意の値を取得する関数です。

4

1 に答える 1

3

itertools.groupbyこれは、 andを使用して非常に簡単に実行できますzip()

data = [
    ['A', '21', '45'],
    ['A', '12', '23'],
    ['A', '54', '21'],
    ['A', '15', '54'],
    ['B', '23', '53'],
    ['B', '34', '53'],
    ['B', '32', '54'],
    ['B', '24', '13'],
    ['C', '31', '43'],
    ['C', '42', '54'],
    ['C', '35', '54'],
    ['C', '12', '11']
]

from itertools import groupby
from operator import itemgetter

for name, values in groupby(data, itemgetter(0)):
    _, first, second = zip(*values)
    print(name, max(first), min(second))

ここで行っているのはgroupby()、リスト項目を最初の項目でグループ化するために使用しています。groupby()これにより、3 つのリストが得られます。A で始まるレコードのリスト、B のリスト、C のリストです。リストを並べ替える必要がないことにも注意してください。

zip()次に、 を使用してトリプレットのリストから値を単一値の 3 つのリストに解凍することにより、これらのリストから値を抽出します。最初の列は関連する A、B、または C であるため破棄し、他の列の最大値と最小値を取得して必要な値を取得します。

これにより、次のことがわかります。

A 54 21
B 34 13
C 42 11

編集:

値をテキストとして持っている場合は、リスト内包表記を使用して、それからリストを作成できますstr.split()

data = """\
A  21 45
A  12 23
A  54 21
A  15 54
B  23 53
B  34 53
B  32 54
B  24 13
C  31 43
C  42 54
C  35 54
C  12 11\
"""

data = [value.split() for value in data.split("\n")]

別の編集:

チャットに従って、次のように余分な列を破棄できます。

Python 3.x:

for name, values in groupby(data, itemgetter(0)):
    _, first, second, *_ = zip(*values)
    print(name, max(first), min(second))

Python 2.x:

for name, values in groupby(data, itemgetter(0)):
    first, second = zip(*values)[1:3]
    print name, max(first), min(second)

そして、値を出力するのではなく、出力をリストにするには:

def max_min_by_group(group):
    for name, values in group:
        _, first, second, *_ = zip(*values)
        yield [name, max(first), min(second)]

new = [item for item in max_min_by_group(groupby(data, itemgetter(0)))]

リスト内包表記とジェネレーターを使用するだけです (1 つの大きな行でこれを行うこともできますが、扱いにくく、読みにくくなります)。これにより、次のことがわかります。

[['A', '54', '21'], ['B', '34', '13'], ['C', '42', '11']]
于 2012-04-29T12:12:02.497 に答える