在python2d数组中排列值

2024-09-25 16:33:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python新手,遇到了一个我无法解决的问题。在

我有以下二维数组:

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[0]的最大值为valuearray[1],每个valuearray[0]的最小值为{}

结果是:

^{pr2}$

编辑:很抱歉没有展示我尝试过的内容

    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]))

但是append只需要一个参数,所以我不知道如何继续。在

uniq是一个函数,它给我一个列表中唯一的值。在


Tags: inci编辑forlenrange数组un
1条回答
网友
1楼 · 发布于 2024-09-25 16:33:00

我们可以很容易地用^{}^{}

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()将列表项按第一项分组。这给了我们三个列表-一个是以a开头的记录的列表,然后是一个B的列表,然后是C。还值得注意的是,groupby()不需要对列表进行排序。在

然后,我们使用zip()将三元组列表中的值解压缩为三个单值列表,从而从这些列表中提取值。我们丢弃第一列,因为它只是相关的A、B或C,然后取其他列的最大值和最小值来获得所需的值。在

这给了我们:

^{pr2}$

编辑:

如果将值作为文本,则可以使用list comprehension^{}从中列出:

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)))]

我们只需使用一个列表理解和一个生成器(我们可以在一个大行中完成这项工作,但这将是笨拙和不可读的)。这给了我们:

[['A', '54', '21'], ['B', '34', '13'], ['C', '42', '11']]

相关问题 更多 >