我有一个
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]]的列表。如何创建包含第二个元素以及字母和最大值的列表?
答案 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)
希望对您有帮助!