在我的列表列表中查找最高版本
Finding the highest version in my list of lists
我有一个列表列表:
['test', 'testlink', 1]
['test', 'testlink', 2]
['test ', 'testlink', 3]
['test ', 'testlink', 4]
['test 2', 'test2link', 1]
['test 2', 'test2link', 2]
['test 3', 'test3link', 1]
['test 3', 'test3link', 3]
['test 3', 'test3link', 4]
我想将列表过滤到 return 每个唯一的第一个元素的第三个元素的最大值。
我想要的结果是:
['test ', 'testlink', 4]
['test 2', 'test2link', 2]
['test 3', 'test3link', 4]
我正在努力寻找一种方法来做到这一点。下面的代码块进入了我的排序列表列表,但在那之后我就卡住了。
#create some dummy data
rows=[]
rows.append(["test","testlink",1])
rows.append(["test 2","test2link",1])
rows.append(["test 3","test3link",1])
rows.append(["test","testlink",2])
rows.append(["test","testlink",1])
rows.append(["test 2","test2link",1])
rows.append(["test 3","test3link",1])
rows.append(["test ","testlink",3])
rows.append(["test 3","test3link",3])
rows.append(["test ","testlink",4])
rows.append(["test 3","test3link",4])
rows.append(["test 2","test2link",2])
#filter out duplicates
newRows = []
for elem in rows:
if elem not in newRows:
newRows.append(elem)
rows = newRows
#sort the lists
rows = sorted(rows,key=lambda x: (x[0],x[2]))
感谢所有排序,给出的答案可以在我的 Ironpython 环境中工作
一个解决方案使用 itertools.groupby
(doc):
rows=[]
rows.append(["test","testlink",1])
rows.append(["test 2","test2link",1])
rows.append(["test 3","test3link",1])
rows.append(["test","testlink",2])
rows.append(["test","testlink",1])
rows.append(["test 2","test2link",1])
rows.append(["test 3","test3link",1])
rows.append(["test ","testlink",3])
rows.append(["test 3","test3link",3])
rows.append(["test ","testlink",4])
rows.append(["test 3","test3link",4])
rows.append(["test 2","test2link",2])
from itertools import groupby
out = []
for v, g in groupby(sorted(rows, key=lambda k: k[0].strip()), lambda k: k[0].strip()):
item = max(g, key=lambda k: k[2])
out.append(item)
from pprint import pprint
pprint(out)
打印:
[['test ', 'testlink', 4],
['test 2', 'test2link', 2],
['test 3', 'test3link', 4]]
您可以使用 defaultdict
:
from collections import defaultdict
l = [['test', 'testlink', 1],
['test', 'testlink', 2],
['test', 'testlink', 3],
['test', 'testlink', 4],
['test 2', 'test2link', 1],
['test 2', 'test2link', 2],
['test 3', 'test3link', 1],
['test 3', 'test3link', 3],
['test 3', 'test3link', 4]]
d = defaultdict(int)
for first, second, third in l:
if d[(first, second)] < third:
d[(first, second)] = third
要以您想要的格式形成结果,请使用下一行:
res = [[*key, value] for key, value in d.items()]
如果你不想导入 defaultdict
你可以使用常规的:
d = {}
for first, second, third in l:
item = d.get((first, second), None)
if not item or item < third:
d[(first, second)] = third
我有一个列表列表:
['test', 'testlink', 1]
['test', 'testlink', 2]
['test ', 'testlink', 3]
['test ', 'testlink', 4]
['test 2', 'test2link', 1]
['test 2', 'test2link', 2]
['test 3', 'test3link', 1]
['test 3', 'test3link', 3]
['test 3', 'test3link', 4]
我想将列表过滤到 return 每个唯一的第一个元素的第三个元素的最大值。
我想要的结果是:
['test ', 'testlink', 4]
['test 2', 'test2link', 2]
['test 3', 'test3link', 4]
我正在努力寻找一种方法来做到这一点。下面的代码块进入了我的排序列表列表,但在那之后我就卡住了。
#create some dummy data
rows=[]
rows.append(["test","testlink",1])
rows.append(["test 2","test2link",1])
rows.append(["test 3","test3link",1])
rows.append(["test","testlink",2])
rows.append(["test","testlink",1])
rows.append(["test 2","test2link",1])
rows.append(["test 3","test3link",1])
rows.append(["test ","testlink",3])
rows.append(["test 3","test3link",3])
rows.append(["test ","testlink",4])
rows.append(["test 3","test3link",4])
rows.append(["test 2","test2link",2])
#filter out duplicates
newRows = []
for elem in rows:
if elem not in newRows:
newRows.append(elem)
rows = newRows
#sort the lists
rows = sorted(rows,key=lambda x: (x[0],x[2]))
感谢所有排序,给出的答案可以在我的 Ironpython 环境中工作
一个解决方案使用 itertools.groupby
(doc):
rows=[]
rows.append(["test","testlink",1])
rows.append(["test 2","test2link",1])
rows.append(["test 3","test3link",1])
rows.append(["test","testlink",2])
rows.append(["test","testlink",1])
rows.append(["test 2","test2link",1])
rows.append(["test 3","test3link",1])
rows.append(["test ","testlink",3])
rows.append(["test 3","test3link",3])
rows.append(["test ","testlink",4])
rows.append(["test 3","test3link",4])
rows.append(["test 2","test2link",2])
from itertools import groupby
out = []
for v, g in groupby(sorted(rows, key=lambda k: k[0].strip()), lambda k: k[0].strip()):
item = max(g, key=lambda k: k[2])
out.append(item)
from pprint import pprint
pprint(out)
打印:
[['test ', 'testlink', 4],
['test 2', 'test2link', 2],
['test 3', 'test3link', 4]]
您可以使用 defaultdict
:
from collections import defaultdict
l = [['test', 'testlink', 1],
['test', 'testlink', 2],
['test', 'testlink', 3],
['test', 'testlink', 4],
['test 2', 'test2link', 1],
['test 2', 'test2link', 2],
['test 3', 'test3link', 1],
['test 3', 'test3link', 3],
['test 3', 'test3link', 4]]
d = defaultdict(int)
for first, second, third in l:
if d[(first, second)] < third:
d[(first, second)] = third
要以您想要的格式形成结果,请使用下一行:
res = [[*key, value] for key, value in d.items()]
如果你不想导入 defaultdict
你可以使用常规的:
d = {}
for first, second, third in l:
item = d.get((first, second), None)
if not item or item < third:
d[(first, second)] = third