我需要比较列表中的元素。我的代码用于列表列表中的两个项目,但是当我有两个以上的项目时,我不知道如何进行。
我的输入具有相同的长度。而且我需要比较hr {
display: block;
margin-top: 0.5em;
margin-bottom: 0.5em;
margin-left: auto;
margin-right: auto;
border-style: inset;
border-width: 1px;
transform: rotate(90deg);
}
,如果重复检查d[][:1]
并用较少的d[][:-1]
打印d[]
我需要的打印件:d[][:-1]
代码:
d = [[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]]
if d[0][:-1] == d[1][:-1]:
if d[0][-1] < d[1][-1]:
d.remove(d[1])
else:
d.remove(d[0])
>>> print d
[[1, 2, 3, 4, 5], [1, 2, 3, 4, 4], [3, 2, 4, 2, 5], [3, 2, 4, 2, 1]]
答案 0 :(得分: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]]
答案 1 :(得分:0)
如果我很了解您想要什么,那么就可以做到这一点:
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]]
它在Python 2和3中工作,它不需要对输入进行排序,也不需要任何依赖关系(这不是真正的参数)。
答案 2 :(得分:0)
您可以使用字典,这要利用以下事实:在您进行迭代时,只有最后一个值将附加到任何给定的键上。该解决方案不需要排序。
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())
答案 3 :(得分:0)
您也可以这样操作:
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]]
答案 4 :(得分:0)