我是 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 的最大值
以及每个 valuearray[1
] [0]valuearray[0]
valuearray[2]
结果将是:
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]))
但是追加只需要一个参数,所以我不知道如何继续。
uniq 是一个函数,它为我提供列表中的唯一值。
最佳答案
我们可以使用 itertools.groupby
轻松完成此操作和 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()
按第一项对列表项进行分组。这为我们提供了三个列表 - 一个以 A 开头的记录列表,然后是 B 的列表,然后是 C。还值得注意的是 groupby()
不需要对列表进行排序。
然后,我们使用 zip()
将值从三元组列表解压缩为三个单个值列表,从而从这些列表中提取值。我们丢弃第一列,因为它只是相关的 A、B 或 C,然后取其他列的最大值和最小值以获得您想要的值。
这给了我们:
A 54 21
B 34 13
C 42 11
编辑:
如果您的值是文本,那么您可以使用 list comprehension和 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)))]
我们只需使用列表理解和生成器(我们可以在一大行中完成此操作,但它会很笨重且不可读)。这给了我们:
[['A', '54', '21'], ['B', '34', '13'], ['C', '42', '11']]
关于python - 在 python 二维数组中排列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10371675/