将此循环转换为列表理解

Converting this loop to a list comprehension

我想通过只保留元素 2 中具有最小值的列表来生成唯一 ID 列表。

例如,给定列表:

list1 = [['Id1', 1, 40],['Id1', 2, 30],['Id2', 10,40]]`

预期输出:

    [['Id1', 1, 40],['Id2', 10,40]]

这是我的工作示例,但它很笨拙。我认为这可能可以通过单个列表理解来完成。

list1 = [['Id1', 1, 40],['Id1', 2, 30],['Id2', 10,40]]

unique_list = list(set([x[0] for x in list1]))
unique_list = [[x] for x in unique_list]

for x in unique_list:
    id = x[0]
    min_val = min([y[1:] for y in list1 if y[0] == id])
    x.extend(min_val )

print unique_list

您可以使用 itertools.groupby 按子列表中的第一个元素分组,您可以使用 key 参数获得 min 以按子列表中的其余元素排序.

>>> from itertools import groupby
[min(list(g), key = lambda i: i[1:]) for k, g in groupby(list1, lambda i: i[0])]
[['Id1', 1, 40], ['Id2', 10, 40]]

一种非常幼稚但易于理解的方法。

list1 = [['Id1', 1, 40],['Id1', 2, 30],['Id2', 10,40]]
unique_list = []
for list_element in list1:
    appendable = True
    for temp_list in unique_list:
        if list_element[0] == temp_list[0]:
            if temp_list[1] < list_element[1]:
               appendable = False
            else:
               unique_list.remove(temp_list)
    if appendable == True:
        unique_list.append(list_element)
    unique_list.sort()

print unique_list