将此循环转换为列表推导

时间:2015-06-23 18:48:16

标签: python python-2.7 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

2 个答案:

答案 0 :(得分:1)

您可以使用itertools.groupby按子列表中的第一个元素进行分组,您可以使用min参数获取key,以按子列表中的其余元素进行排序。 / p>

>>> 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]]

答案 1 :(得分:0)

一种非常天真的方法,但很容易理解。

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