列表列表,将最后一项与python进行比较

列表列表,将最后一项与python进行比较,python,list,Python,List,我需要比较列表中的元素。我的代码用于列表中的两个项目,但当我有两个以上的项目时,我不知道如何继续。 我的输入具有相同的len。我需要比较d[][:1],如果重复,请检查d[][:-1],并用较少的d[][:-1]打印d[] 我需要的打印:d=[[1,2,3,4,4],[3,2,4,2,1] 代码: 您可以使用itertools.groupby首先按最后一项以外的所有项对列表进行分组,然后使用min按最后一项对子列表进行排序: from operator import itemgetter fro

我需要比较列表中的元素。我的代码用于列表中的两个项目,但当我有两个以上的项目时,我不知道如何继续。 我的输入具有相同的len。我需要比较
d[][:1]
,如果重复,请检查
d[][:-1]
,并用较少的
d[][:-1]
打印
d[]

我需要的打印:
d=[[1,2,3,4,4],[3,2,4,2,1]

代码:


您可以使用
itertools.groupby
首先按最后一项以外的所有项对列表进行分组,然后使用
min
按最后一项对子列表进行排序:

from operator import itemgetter
from itertools import groupby
d = [[1, 2, 3, 4, 5],
     [1, 2, 3, 4, 6],
     [1, 2, 3, 4, 4],
     [3, 2, 4, 2, 5],
     [3, 2, 4, 2, 1]]
print([min(g, key=itemgetter(-1)) for _, g in groupby(d, key=lambda s: s[:-1])])
这将产生:

[[1, 2, 3, 4, 4], [3, 2, 4, 2, 1]]

如果我很清楚你想要什么,这应该可以做到:

d = [[1, 2, 3, 4, 5],
     [1, 2, 3, 4, 6],
     [1, 2, 3, 4, 4],
     [3, 2, 4, 2, 5],
     [3, 2, 4, 2, 1]]


mins = {}
for a_list in d:
    list_key = ','.join(map(str, a_list[:-1]))
    list_orderer = a_list[-1]
    if list_key not in mins or mins[list_key] > list_orderer:
        mins[list_key] = a_list

print(sorted(mins.values()))  # [[1, 2, 3, 4, 4], [3, 2, 4, 2, 1]]

它在Python2和Python3中工作,不需要对输入进行排序,也不需要任何依赖项(这不是真正的参数)。

您可以使用字典,利用这样一个事实,即在迭代时,只有最后一个值将附加到任何给定的键。解决方案不需要排序

d2 = {tuple(key): val for *key, val in d}
res = [list(k) + [v] for k, v in d2.items()]

print(res)

[[1, 2, 3, 4, 4],
 [3, 2, 4, 2, 1]]
注意元组转换是必需的,因为列表是不可散列的,所以它们不能用作字典键

编辑:正如@JonClements所建议的,您可以更简单地将其写成:

res = list({tuple(el[:-1]): el for el in d}.values())

您也可以这样做:

d = [[1, 2, 3, 4, 5],
     [1, 2, 3, 4, 6],
     [1, 2, 3, 4, 4],
     [3, 2, 4, 2, 5],
     [3, 2, 4, 2, 1]]

sublists = list(set(tuple(i[:-1]) for i in d))
mins = [min([elem for elem in d if elem[:-1]==list(s)])for s in sublists]

print(mins)
输出:

[[3, 2, 4, 2, 1], [1, 2, 3, 4, 4]]
按比例放大的。对于更大的数据和跳过排序的需要

import pandas as pd

cols = ['v1', 'v2', 'v3', 'v4', 'v5']

df = pd.DataFrame(d, columns=cols)

ndf = df.groupby(cols[:-1], as_index=False).min()

out = ndf.values.tolist()

print(out)

[[1, 2, 3, 4, 4], [3, 2, 4, 2, 1]]

如果你能用文字解释一下你的输入如何变成你想要的输出的逻辑,那会有帮助。你想要什么,两个最小的项目(其中比较是通过最后一个元素)?我编辑了提问@Jonclements对于相同的第一个元素,您希望列表中的最后一个元素最少-是否正确?
用较少的d[][:-1]
打印d[]是什么意思?谢谢。如果我需要变量中的输出,我如何添加它?值得注意的是,此解决方案需要对输入进行排序。@MartinBouhier您可以简单地将列表分配给变量,而不是打印它,例如,
d=[min(g,key=itemgetter(-1)]for groupby(d,key=lambda s:s[:-1])
,如果某些项目是str,则它不起作用。我该怎么做?@MartinBouhier您可以先将字符串转换为整数,然后再进行比较:
[min(g,key=lambda s:int(s[-1])对于groupby(d,key=lambda s:s[:-1])]中的g(d,key=lambda s:s[:-1])
注意,这是特定于实现扩展解包的Python 3+版本的,假设它们已经按顺序排序(假设这个答案使)并坚持使用“<代码> DATT <代码>来保留最后一个条目,则使用起来有点简单:<代码> RES =列表({EL〔0〕:EL在D }值)(<代码> > J.Con Currices,谢谢,我想你可以适应这一小事来考虑<代码> EL[(1)] <代码>,而不是<代码> EL〔0〕。。不确定为什么需要一个元组…
[:-1]
将是一个最多包含一个元素的列表-最好将其设置为
[-1]
并使用
元组进行转换…另外-我可能读错了Q,但认为分组键应该是第一个元素…但我看到它可能不是:)哦我的错。。。对很抱歉疲惫的眼睛。。。很明显,现在他们除了最后一项外,什么都用做组键。。。谢谢
[[3, 2, 4, 2, 1], [1, 2, 3, 4, 4]]
import pandas as pd

cols = ['v1', 'v2', 'v3', 'v4', 'v5']

df = pd.DataFrame(d, columns=cols)

ndf = df.groupby(cols[:-1], as_index=False).min()

out = ndf.values.tolist()

print(out)

[[1, 2, 3, 4, 4], [3, 2, 4, 2, 1]]