如何获取具有最高编号([a,3])的列表([a,2],[a,1],[a,3])

时间:2019-05-21 16:01:06

标签: python pandas numpy dataframe

我有一个

list=[[a,2],[a,1],[a,3],[b,5],[b,7],[b,6],[c,20],[c,23],[c,30]].

如何获取每个字母的最高编号列表?并将该列表附加到包含每个字母的最高编号的另一个列表中?

我尝试使用下面的代码,但是它是python编程的新手,并且我对数据结构或编程了解不多。

for letter in range(len(final)):
    array1=[]
    array2=[]
    highestvalue=0
    if final[letter][0] == final[letter+1][0]:
        if final[letter][2] < final[letter+1][2]:
            highestvalue=final[letter+1][2]
            array1.append(final[letter][0])
            array1.append(highestvalue)
            array2.append(array1)

有没有办法使[[a,3],[b,7],[c,30]]脱离名单?

[编辑] 实际上,我的列表是[[a,abc,2],[a,def,1],[a,ghi,3],[b,jkl,5],[b,lmn,7],[b,opq ,6],[c,rst,20],[c,vwx,23],[c,yzz,30]]。

我期望的是创建一个存储变量[[a,ghi,3],[b,lmn,7],[c,yzz,30]]的列表。如何创建包含第二个元素以及字母和最大值的列表?

8 个答案:

答案 0 :(得分:2)

您可以使用itertools.groupby按字母对子列表进行分组,并在每个组中查找最大值:

from operator import itemgetter as g
from itertools import groupby

[max(v, key=g(1)) for k, v in groupby(l, g(0))]
# [['a', 3], ['b', 7], ['c', 30]]

答案 1 :(得分:2)

自从标记pandas

pd.DataFrame(l).groupby(0).max().reset_index().values.tolist()
Out[535]: [['a', 3], ['b', 7], ['c', 30]]

答案 2 :(得分:1)

>>> foo = [['a', 2],['a', 1],['a', 3],
           ['b', 5],['b', 7],['b', 6],
           ['c', 20],['c', 23],['c', 30]]
>>> print({key:value for key, value in sorted(foo)})
{'a': 3, 'b': 7, 'c': 30}

答案 3 :(得分:0)

您可以使用简单的Python生成器解决它:

lst=[['a',2],['a',1],['a',3],['b',5],['b',7],['b',6],['c',20],['c',23],['c',30]]
[max(filter(lambda x: x[0] == elem, lst), key=lambda x: x[1]) for elem in set([e[0] for e in lst])]

将返回您

[['c', 30], ['b', 7], ['a', 3]]

答案 4 :(得分:0)

您应该考虑使用一个位置来存储(词典)每个字母所遇到的最大值。

然后遍历列表,并将存储的值与字母的新值进行比较。

list=[[a,2],[a,1],[a,3],[b,5],[b,7],[b,6],[c,20],[c,23],[c,30]]
storing_maximum={}
for x,y in list:
    if x in storing_maximum:
        storing_maximum[x] = max(storing_maximum[x],y)
    else:
        storing_maximum[x] = y

答案 5 :(得分:0)

首先,将您的列表分成几个单独的列表,每个字母一个。 然后构建第二个元素的列表,并使用其中的max

另一种可能性是构建一个以字母为键的dict;每个元素的值就是您看到的字母的最大值。

您能在那里取它吗?如果不是,我建议您与本地人员通通逻辑,因为Stack Overflow并非教程站点。

答案 6 :(得分:0)

熊猫解决方案:

pd.DataFrame(l).sort_values([0, 2]).drop_duplicates(subset=[0], keep='last').values.tolist()

Out[23]: [['a', 'ghi', 3], ['b', 'lmn', 7], ['c', 'yzz', 30]]

答案 7 :(得分:0)

您可能想将临时最大值存储在字典中。这样,您仍然可以以O(n)的复杂性来解决它。看一下这个简单的例子:

mylist = [['a','abc',2],['a','def',1],['a','ghi',3],['b','jkl',5],['b','lmn',7],['b','opq',6],['c','rst',20],['c','vwx',23],['c','yzz',30]]

myres = []
mymax = {}

for l in mylist:
    # corresponds to 'a', 'b', 'c', ...
    k = l[0]

    # if your identifier is not already stored
    # or the last value of your array is greater than the one that is already stored
    if not k in mymax or l[-1] > mymax[k][-1]:
        # apply a new maximum
        # *after first iteration it holds -> {'a': ['a','abc',2]}
        mymax[k] = l

# is used to convert back to a list, you may as well skip it if not needed
for _, v in mymax.items():
    myres.append(v)

# prints [['a', 'ghi', 3], ['b', 'lmn', 7], ['c', 'yzz', 30]]
print(myres)

希望对您有帮助!